diff --git a/src/main/java/gg/agit/konect/domain/chat/repository/ChatMessageRepository.java b/src/main/java/gg/agit/konect/domain/chat/repository/ChatMessageRepository.java index dc7876acd..fab852605 100644 --- a/src/main/java/gg/agit/konect/domain/chat/repository/ChatMessageRepository.java +++ b/src/main/java/gg/agit/konect/domain/chat/repository/ChatMessageRepository.java @@ -78,17 +78,6 @@ boolean existsUserReplyByRoomId( @Param("adminRole") UserRole adminRole ); - @Query(""" - SELECT DISTINCT cm.chatRoom.id - FROM ChatMessage cm - WHERE cm.chatRoom.id IN :chatRoomIds - AND cm.sender.role != :adminRole - """) - List findRoomIdsWithUserReplyByRoomIds( - @Param("chatRoomIds") List chatRoomIds, - @Param("adminRole") UserRole adminRole - ); - @Query(""" SELECT m FROM ChatMessage m diff --git a/src/main/java/gg/agit/konect/domain/chat/repository/ChatRoomMemberRepository.java b/src/main/java/gg/agit/konect/domain/chat/repository/ChatRoomMemberRepository.java index 255030852..29cc87644 100644 --- a/src/main/java/gg/agit/konect/domain/chat/repository/ChatRoomMemberRepository.java +++ b/src/main/java/gg/agit/konect/domain/chat/repository/ChatRoomMemberRepository.java @@ -68,17 +68,6 @@ boolean existsByChatRoomIdAndUserId( """) List findByUserId(@Param("userId") Integer userId); - @Query(""" - SELECT crm - FROM ChatRoomMember crm - WHERE crm.id.chatRoomId IN :chatRoomIds - AND crm.id.userId = :userId - """) - List findByChatRoomIdsAndUserId( - @Param("chatRoomIds") List chatRoomIds, - @Param("userId") Integer userId - ); - @Modifying @Query(""" UPDATE ChatRoomMember crm 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 c1a308912..5051be688 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 @@ -54,14 +54,6 @@ AND SUM(CASE WHEN crm.id.userId = :userId2 THEN 1 ELSE 0 END) = 1 """) Optional findByClubId(@Param("clubId") Integer clubId); - @Query(""" - SELECT cr - FROM ChatRoom cr - LEFT JOIN FETCH cr.club c - WHERE c.id IN :clubIds - """) - List findByClubIds(@Param("clubIds") List clubIds); - @Query(""" SELECT DISTINCT cr FROM ChatRoom cr 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 21f9b463b..8fc21c252 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 @@ -9,7 +9,6 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -245,7 +244,7 @@ private List getDirectChatRooms(Integer userId) { Map userMap = allUserIds.isEmpty() ? Map.of() : userRepository.findAllByIdIn(allUserIds).stream() - .collect(Collectors.toMap(User::getId, u -> u)); + .collect(Collectors.toMap(User::getId, u -> u)); for (ChatRoom chatRoom : personalChatRooms) { List memberInfos = roomMemberInfoMap.getOrDefault(chatRoom.getId(), List.of()); @@ -282,12 +281,8 @@ private List getAdminDirectChatRooms() { List adminUserRooms = chatRoomRepository.findAllSystemAdminDirectRooms( SYSTEM_ADMIN_ID, UserRole.ADMIN ); - List roomIds = extractChatRoomIds(adminUserRooms); Map> roomMemberInfoMap = getRoomMemberInfoMap(adminUserRooms); - Map adminUnreadCountMap = getAdminUnreadCountMap(roomIds); - Set repliedRoomIds = roomIds.isEmpty() - ? Set.of() - : new HashSet<>(chatMessageRepository.findRoomIdsWithUserReplyByRoomIds(roomIds, UserRole.ADMIN)); + Map adminUnreadCountMap = getAdminUnreadCountMap(extractChatRoomIds(adminUserRooms)); List allUserIds = roomMemberInfoMap.values().stream() .flatMap(List::stream) @@ -298,7 +293,7 @@ private List getAdminDirectChatRooms() { Map userMap = allUserIds.isEmpty() ? Map.of() : userRepository.findAllByIdIn(allUserIds).stream() - .collect(Collectors.toMap(User::getId, user -> user)); + .collect(Collectors.toMap(User::getId, user -> user)); for (ChatRoom chatRoom : adminUserRooms) { List memberInfos = roomMemberInfoMap.getOrDefault(chatRoom.getId(), List.of()); @@ -306,7 +301,7 @@ private List getAdminDirectChatRooms() { if (nonAdminUser == null) { continue; } - if (!repliedRoomIds.contains(chatRoom.getId())) { + if (!chatMessageRepository.existsUserReplyByRoomId(chatRoom.getId(), UserRole.ADMIN)) { continue; } @@ -446,8 +441,17 @@ private List getClubChatRooms(Integer userId) { Map membershipByClubId = memberships.stream() .collect(Collectors.toMap(cm -> cm.getClub().getId(), cm -> cm, (a, b) -> a)); - List rooms = resolveOrCreateClubRooms(memberships); - ensureClubRoomMembers(rooms, membershipByClubId, userId); + List rooms = memberships.stream() + .map(ClubMember::getClub) + .map(this::resolveOrCreateClubRoom) + .toList(); + + for (ChatRoom room : rooms) { + ClubMember member = membershipByClubId.get(room.getClub().getId()); + if (member != null) { + ensureRoomMember(room, member.getUser(), member.getCreatedAt()); + } + } List roomIds = rooms.stream().map(ChatRoom::getId).toList(); Map lastMessageMap = getLastMessageMap(roomIds); @@ -592,61 +596,9 @@ private ChatRoom getClubRoom(Integer roomId) { return room; } - private List resolveOrCreateClubRooms(List memberships) { - Map clubById = memberships.stream() - .map(ClubMember::getClub) - .collect(Collectors.toMap(Club::getId, club -> club, (a, b) -> a)); - - Map roomByClubId = chatRoomRepository.findByClubIds(new ArrayList<>(clubById.keySet())) - .stream() - .filter(room -> room.getClub() != null) - .collect(Collectors.toMap(room -> room.getClub().getId(), room -> room, (a, b) -> a)); - - for (Map.Entry clubEntry : clubById.entrySet()) { - if (roomByClubId.containsKey(clubEntry.getKey())) { - continue; - } - - ChatRoom createdRoom = chatRoomRepository.save(ChatRoom.groupOf(clubEntry.getValue())); - roomByClubId.put(clubEntry.getKey(), createdRoom); - } - - return memberships.stream() - .map(membership -> roomByClubId.get(membership.getClub().getId())) - .toList(); - } - - private void ensureClubRoomMembers( - List rooms, - Map membershipByClubId, - Integer userId - ) { - if (rooms.isEmpty()) { - return; - } - - Map memberByRoomId = chatRoomMemberRepository - .findByChatRoomIdsAndUserId(extractChatRoomIds(rooms), userId) - .stream() - .collect(Collectors.toMap(ChatRoomMember::getChatRoomId, member -> member, (a, b) -> a)); - - for (ChatRoom room : rooms) { - ClubMember member = membershipByClubId.get(room.getClub().getId()); - if (member == null) { - continue; - } - - ChatRoomMember existingMember = memberByRoomId.get(room.getId()); - if (existingMember != null) { - LocalDateTime lastReadAt = existingMember.getLastReadAt(); - if (lastReadAt == null || lastReadAt.isBefore(member.getCreatedAt())) { - existingMember.updateLastReadAt(member.getCreatedAt()); - } - continue; - } - - chatRoomMemberRepository.save(ChatRoomMember.of(room, member.getUser(), member.getCreatedAt())); - } + private ChatRoom resolveOrCreateClubRoom(Club club) { + return chatRoomRepository.findByClubId(club.getId()) + .orElseGet(() -> chatRoomRepository.save(ChatRoom.groupOf(club))); } private List extractChatRoomIds(List chatRooms) { diff --git a/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java b/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java index 6a08d2a91..42134e6ac 100644 --- a/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java +++ b/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java @@ -52,7 +52,6 @@ List findAllByClubIdAndPosition( SELECT cm FROM ClubMember cm JOIN FETCH cm.club c - JOIN FETCH cm.user WHERE cm.id.userId = :userId """) List findAllByUserId(Integer userId);