Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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<Integer> findRoomIdsWithUserReplyByRoomIds(
@Param("chatRoomIds") List<Integer> chatRoomIds,
@Param("adminRole") UserRole adminRole
);

@Query("""
SELECT m
FROM ChatMessage m
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,17 +68,6 @@ boolean existsByChatRoomIdAndUserId(
""")
List<ChatRoomMember> findByUserId(@Param("userId") Integer userId);

@Query("""
SELECT crm
FROM ChatRoomMember crm
WHERE crm.id.chatRoomId IN :chatRoomIds
AND crm.id.userId = :userId
""")
List<ChatRoomMember> findByChatRoomIdsAndUserId(
@Param("chatRoomIds") List<Integer> chatRoomIds,
@Param("userId") Integer userId
);

@Modifying
@Query("""
UPDATE ChatRoomMember crm
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,14 +54,6 @@ AND SUM(CASE WHEN crm.id.userId = :userId2 THEN 1 ELSE 0 END) = 1
""")
Optional<ChatRoom> findByClubId(@Param("clubId") Integer clubId);

@Query("""
SELECT cr
FROM ChatRoom cr
LEFT JOIN FETCH cr.club c
WHERE c.id IN :clubIds
""")
List<ChatRoom> findByClubIds(@Param("clubIds") List<Integer> clubIds);

@Query("""
SELECT DISTINCT cr
FROM ChatRoom cr
Expand Down
84 changes: 18 additions & 66 deletions src/main/java/gg/agit/konect/domain/chat/service/ChatService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -245,7 +244,7 @@ private List<ChatRoomSummaryResponse> getDirectChatRooms(Integer userId) {
Map<Integer, User> 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<MemberInfo> memberInfos = roomMemberInfoMap.getOrDefault(chatRoom.getId(), List.of());
Expand Down Expand Up @@ -282,12 +281,8 @@ private List<ChatRoomSummaryResponse> getAdminDirectChatRooms() {
List<ChatRoom> adminUserRooms = chatRoomRepository.findAllSystemAdminDirectRooms(
SYSTEM_ADMIN_ID, UserRole.ADMIN
);
List<Integer> roomIds = extractChatRoomIds(adminUserRooms);
Map<Integer, List<MemberInfo>> roomMemberInfoMap = getRoomMemberInfoMap(adminUserRooms);
Map<Integer, Integer> adminUnreadCountMap = getAdminUnreadCountMap(roomIds);
Set<Integer> repliedRoomIds = roomIds.isEmpty()
? Set.of()
: new HashSet<>(chatMessageRepository.findRoomIdsWithUserReplyByRoomIds(roomIds, UserRole.ADMIN));
Map<Integer, Integer> adminUnreadCountMap = getAdminUnreadCountMap(extractChatRoomIds(adminUserRooms));

List<Integer> allUserIds = roomMemberInfoMap.values().stream()
.flatMap(List::stream)
Expand All @@ -298,15 +293,15 @@ private List<ChatRoomSummaryResponse> getAdminDirectChatRooms() {
Map<Integer, User> 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<MemberInfo> memberInfos = roomMemberInfoMap.getOrDefault(chatRoom.getId(), List.of());
User nonAdminUser = findNonAdminUserFromMemberInfo(memberInfos, userMap);
if (nonAdminUser == null) {
continue;
}
if (!repliedRoomIds.contains(chatRoom.getId())) {
if (!chatMessageRepository.existsUserReplyByRoomId(chatRoom.getId(), UserRole.ADMIN)) {
continue;
}

Expand Down Expand Up @@ -446,8 +441,17 @@ private List<ChatRoomSummaryResponse> getClubChatRooms(Integer userId) {
Map<Integer, ClubMember> membershipByClubId = memberships.stream()
.collect(Collectors.toMap(cm -> cm.getClub().getId(), cm -> cm, (a, b) -> a));

List<ChatRoom> rooms = resolveOrCreateClubRooms(memberships);
ensureClubRoomMembers(rooms, membershipByClubId, userId);
List<ChatRoom> 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<Integer> roomIds = rooms.stream().map(ChatRoom::getId).toList();
Map<Integer, ChatMessage> lastMessageMap = getLastMessageMap(roomIds);
Expand Down Expand Up @@ -592,61 +596,9 @@ private ChatRoom getClubRoom(Integer roomId) {
return room;
}

private List<ChatRoom> resolveOrCreateClubRooms(List<ClubMember> memberships) {
Map<Integer, Club> clubById = memberships.stream()
.map(ClubMember::getClub)
.collect(Collectors.toMap(Club::getId, club -> club, (a, b) -> a));

Map<Integer, ChatRoom> 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<Integer, Club> 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<ChatRoom> rooms,
Map<Integer, ClubMember> membershipByClubId,
Integer userId
) {
if (rooms.isEmpty()) {
return;
}

Map<Integer, ChatRoomMember> 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<Integer> extractChatRoomIds(List<ChatRoom> chatRooms) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ List<ClubMember> findAllByClubIdAndPosition(
SELECT cm
FROM ClubMember cm
JOIN FETCH cm.club c
JOIN FETCH cm.user
WHERE cm.id.userId = :userId
""")
List<ClubMember> findAllByUserId(Integer userId);
Expand Down
Loading