mirror of
https://github.com/nagisa77/OpenIsle.git
synced 2026-02-20 05:50:53 +08:00
feat: add channel support
This commit is contained in:
@@ -82,6 +82,49 @@ public class MessageService {
|
||||
return message;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public Message sendMessageToConversation(Long senderId, Long conversationId, String content) {
|
||||
User sender = userRepository.findById(senderId)
|
||||
.orElseThrow(() -> new IllegalArgumentException("Sender not found"));
|
||||
MessageConversation conversation = conversationRepository.findById(conversationId)
|
||||
.orElseThrow(() -> new IllegalArgumentException("Conversation not found"));
|
||||
|
||||
// Join the conversation if not already a participant (useful for channels)
|
||||
participantRepository.findByConversationIdAndUserId(conversationId, senderId)
|
||||
.orElseGet(() -> {
|
||||
MessageParticipant p = new MessageParticipant();
|
||||
p.setConversation(conversation);
|
||||
p.setUser(sender);
|
||||
return participantRepository.save(p);
|
||||
});
|
||||
|
||||
Message message = new Message();
|
||||
message.setConversation(conversation);
|
||||
message.setSender(sender);
|
||||
message.setContent(content);
|
||||
message = messageRepository.save(message);
|
||||
|
||||
conversation.setLastMessage(message);
|
||||
conversationRepository.save(conversation);
|
||||
|
||||
MessageDto messageDto = toDto(message);
|
||||
String conversationDestination = "/topic/conversation/" + conversation.getId();
|
||||
messagingTemplate.convertAndSend(conversationDestination, messageDto);
|
||||
|
||||
// Notify all participants except sender for updates
|
||||
for (MessageParticipant participant : conversation.getParticipants()) {
|
||||
if (participant.getUser().getId().equals(senderId)) continue;
|
||||
String userDestination = "/topic/user/" + participant.getUser().getId() + "/messages";
|
||||
messagingTemplate.convertAndSend(userDestination, messageDto);
|
||||
|
||||
long unreadCount = getUnreadMessageCount(participant.getUser().getId());
|
||||
String username = participant.getUser().getUsername();
|
||||
messagingTemplate.convertAndSendToUser(username, "/queue/unread-count", unreadCount);
|
||||
}
|
||||
|
||||
return message;
|
||||
}
|
||||
|
||||
private MessageDto toDto(Message message) {
|
||||
MessageDto dto = new MessageDto();
|
||||
dto.setId(message.getId());
|
||||
@@ -134,12 +177,18 @@ public class MessageService {
|
||||
@Transactional(readOnly = true)
|
||||
public List<ConversationDto> getConversations(Long userId) {
|
||||
List<MessageConversation> conversations = conversationRepository.findConversationsByUserIdOrderByLastMessageDesc(userId);
|
||||
return conversations.stream().map(c -> toDto(c, userId)).collect(Collectors.toList());
|
||||
return conversations.stream()
|
||||
.filter(c -> !c.isChannel())
|
||||
.map(c -> toDto(c, userId))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private ConversationDto toDto(MessageConversation conversation, Long userId) {
|
||||
ConversationDto dto = new ConversationDto();
|
||||
dto.setId(conversation.getId());
|
||||
dto.setChannel(conversation.isChannel());
|
||||
dto.setName(conversation.getName());
|
||||
dto.setAvatar(conversation.getAvatar());
|
||||
dto.setCreatedAt(conversation.getCreatedAt());
|
||||
if (conversation.getLastMessage() != null) {
|
||||
dto.setLastMessage(toDto(conversation.getLastMessage()));
|
||||
@@ -189,6 +238,9 @@ public class MessageService {
|
||||
|
||||
ConversationDetailDto detailDto = new ConversationDetailDto();
|
||||
detailDto.setId(conversation.getId());
|
||||
detailDto.setName(conversation.getName());
|
||||
detailDto.setChannel(conversation.isChannel());
|
||||
detailDto.setAvatar(conversation.getAvatar());
|
||||
detailDto.setParticipants(participants);
|
||||
detailDto.setMessages(messageDtoPage);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user