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 fromUser = userRepository .findByUserName(fromUserName); final Optional toUser = userRepository .findByUserName(toUserName); final Optional 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 getAllMessages(final String fromUser, final String toUser) { final List chatMessages = chatMessageRepository .getAllMessages(fromUser, toUser); final List chatMessageDTOs = myConversionService .convertToChatMessageDTOs(chatMessages); return chatMessageDTOs; } @Override @Transactional(readOnly = true) public List getAllMessagesForReencryption( final String fromUser, final String toUser) { return myConversionService.convertToReencryptionDTOs( chatMessageRepository.getAllMessages(fromUser, toUser)); } @Override @Transactional(readOnly = true) public List 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 getNewMessages(final String fromUser, final String toUser, final Date lastMessageTime) { final List chatMessages = chatMessageRepository .getNewMessages(fromUser, toUser, lastMessageTime); return myConversionService.convertToChatMessageDTOs(chatMessages); } @Override public void reencryptMessages( final List reencryptionDTOs) { final List messageCiphers = reencryptionDTOs.stream() .map(reencryptionDTO -> reencryptionDTO.getMessageCipher()) .collect(Collectors.toList()); messageCipherRepository.saveAll(messageCiphers); } }