ChatRoomQueryServiceImpl.java
package com.deveagles.be15_deveagles_be.features.chat.query.service.impl;
import com.deveagles.be15_deveagles_be.features.chat.command.domain.aggregate.ChatMessage;
import com.deveagles.be15_deveagles_be.features.chat.command.domain.aggregate.ChatRoom;
import com.deveagles.be15_deveagles_be.features.chat.command.domain.repository.ChatMessageRepository;
import com.deveagles.be15_deveagles_be.features.chat.query.dto.response.ChatRoomSummaryResponse;
import com.deveagles.be15_deveagles_be.features.chat.query.repository.ChatRoomQueryRepository;
import com.deveagles.be15_deveagles_be.features.chat.query.service.ChatRoomQueryService;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class ChatRoomQueryServiceImpl implements ChatRoomQueryService {
private final ChatRoomQueryRepository chatRoomQueryRepository;
private final ChatMessageRepository chatMessageRepository;
@Override
public List<ChatRoomSummaryResponse> getMyChatRooms(Long userId, boolean isStaff) {
List<ChatRoom> rooms =
isStaff
? chatRoomQueryRepository.findByAssignedStaffIdAndIsAiActiveFalse(userId)
: chatRoomQueryRepository.findByParticipantId(userId);
return rooms.stream().map(room -> toSummaryResponse(room, isStaff)).toList();
}
private ChatRoomSummaryResponse toSummaryResponse(ChatRoom room, boolean isStaff) {
Optional<ChatMessage> latestMessageOpt =
chatMessageRepository.findTopByChatroomIdOrderByCreatedAtDesc(room.getId());
LocalDateTime lastMessageAt = latestMessageOpt.map(ChatMessage::getCreatedAt).orElse(null);
if (isStaff) {
ChatRoom.Participant p = room.getParticipant();
return ChatRoomSummaryResponse.builder()
.roomId(room.getId())
.customerName(p.getName())
.customerShopName(p.getShopName())
.lastMessageAt(lastMessageAt)
.build();
} else {
return ChatRoomSummaryResponse.builder()
.roomId(room.getId())
.lastMessageAt(lastMessageAt)
.build();
}
}
}