A self hosted chat application with end-to-end encrypted messaging.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

105 lines
3.6 KiB

package org.ros.chatto.service;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import org.modelmapper.ModelMapper;
import org.ros.chatto.dto.ChatMessageDTO;
import org.ros.chatto.dto.MessageCipherDTO;
import org.ros.chatto.dto.ReencryptionDTO;
import org.ros.chatto.model.ChatMessage;
import org.ros.chatto.model.ChatUser;
import org.ros.chatto.model.MessageCipher;
import org.ros.chatto.repository.ChatMessageRepository;
import org.ros.chatto.repository.MessageCipherRepository;
import org.ros.chatto.repository.UserRepository;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import lombok.RequiredArgsConstructor;
@Service
@Transactional
@RequiredArgsConstructor
public class ChatServiceImpl implements ChatService {
private final ModelMapper modelMapper;
private final UserRepository userRepository;
private final MessageCipherRepository messageCipherRepository;
private final ChatMessageRepository chatMessageRepository;
private final MyConversionService myConversionService;
public ChatMessageDTO createMessage(final String fromUserName,
final String toUserName, final MessageCipherDTO messageCipherDTO) {
final Optional<ChatUser> fromUser = userRepository
.findByUserName(fromUserName);
final Optional<ChatUser> toUser = userRepository
.findByUserName(toUserName);
final Optional<ChatMessage> cm = fromUser.flatMap(fu -> {
return toUser.map(tu -> {
ChatMessage chatMessage = new ChatMessage();
MessageCipher messageCipher = myConversionService
.convertToMessageCipher(messageCipherDTO);
messageCipher = messageCipherRepository.save(messageCipher);
chatMessage.setMessageCipher(messageCipher);
chatMessage.setFromUser(fu);
chatMessage.setToUser(tu);
chatMessage = chatMessageRepository.save(chatMessage);
return chatMessage;
});
});
return modelMapper.map(cm, ChatMessageDTO.class);
}
@Override
@Transactional(readOnly = true)
public List<ChatMessageDTO> getAllMessages(final String fromUser,
final String toUser) {
final List<ChatMessage> chatMessages = chatMessageRepository
.getAllMessages(fromUser, toUser);
final List<ChatMessageDTO> chatMessageDTOs = myConversionService
.convertToChatMessageDTOs(chatMessages);
return chatMessageDTOs;
}
@Override
@Transactional(readOnly = true)
public List<ReencryptionDTO> getAllMessagesForReencryption(
final String fromUser, final String toUser) {
return myConversionService.convertToReencryptionDTOs(
chatMessageRepository.getAllMessages(fromUser, toUser));
}
@Override
@Transactional(readOnly = true)
public List<ChatMessageDTO> getMessagePage(final String fromUser,
final String toUser, final int page, final int size) {
return myConversionService.convertToChatMessageDTOs(
chatMessageRepository.getAllMessages(fromUser, toUser,
PageRequest.of(page, size)));
}
@Override
@Transactional(readOnly = true)
public List<ChatMessageDTO> getNewMessages(final String fromUser,
final String toUser, final Date lastMessageTime) {
final List<ChatMessage> chatMessages = chatMessageRepository
.getNewMessages(fromUser, toUser, lastMessageTime);
return myConversionService.convertToChatMessageDTOs(chatMessages);
}
@Override
public void reencryptMessages(
final List<ReencryptionDTO> reencryptionDTOs) {
final List<MessageCipher> messageCiphers = reencryptionDTOs.stream()
.map(reencryptionDTO -> reencryptionDTO.getMessageCipher())
.collect(Collectors.toList());
messageCipherRepository.saveAll(messageCiphers);
}
}