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

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
  1. package org.ros.chatto.service;
  2. import java.util.Date;
  3. import java.util.List;
  4. import java.util.Optional;
  5. import java.util.stream.Collectors;
  6. import org.modelmapper.ModelMapper;
  7. import org.ros.chatto.dto.ChatMessageDTO;
  8. import org.ros.chatto.dto.MessageCipherDTO;
  9. import org.ros.chatto.dto.ReencryptionDTO;
  10. import org.ros.chatto.model.ChatMessage;
  11. import org.ros.chatto.model.ChatUser;
  12. import org.ros.chatto.model.MessageCipher;
  13. import org.ros.chatto.repository.ChatMessageRepository;
  14. import org.ros.chatto.repository.MessageCipherRepository;
  15. import org.ros.chatto.repository.UserRepository;
  16. import org.springframework.data.domain.PageRequest;
  17. import org.springframework.stereotype.Service;
  18. import org.springframework.transaction.annotation.Transactional;
  19. import lombok.RequiredArgsConstructor;
  20. @Service
  21. @Transactional
  22. @RequiredArgsConstructor
  23. public class ChatServiceImpl implements ChatService {
  24. private final ModelMapper modelMapper;
  25. private final UserRepository userRepository;
  26. private final MessageCipherRepository messageCipherRepository;
  27. private final ChatMessageRepository chatMessageRepository;
  28. private final MyConversionService myConversionService;
  29. public ChatMessageDTO createMessage(final String fromUserName,
  30. final String toUserName, final MessageCipherDTO messageCipherDTO) {
  31. final Optional<ChatUser> fromUser = userRepository
  32. .findByUserName(fromUserName);
  33. final Optional<ChatUser> toUser = userRepository
  34. .findByUserName(toUserName);
  35. final Optional<ChatMessage> cm = fromUser.flatMap(fu -> {
  36. return toUser.map(tu -> {
  37. ChatMessage chatMessage = new ChatMessage();
  38. MessageCipher messageCipher = myConversionService
  39. .convertToMessageCipher(messageCipherDTO);
  40. messageCipher = messageCipherRepository.save(messageCipher);
  41. chatMessage.setMessageCipher(messageCipher);
  42. chatMessage.setFromUser(fu);
  43. chatMessage.setToUser(tu);
  44. chatMessage = chatMessageRepository.save(chatMessage);
  45. return chatMessage;
  46. });
  47. });
  48. return modelMapper.map(cm, ChatMessageDTO.class);
  49. }
  50. @Override
  51. @Transactional(readOnly = true)
  52. public List<ChatMessageDTO> getAllMessages(final String fromUser,
  53. final String toUser) {
  54. final List<ChatMessage> chatMessages = chatMessageRepository
  55. .getAllMessages(fromUser, toUser);
  56. final List<ChatMessageDTO> chatMessageDTOs = myConversionService
  57. .convertToChatMessageDTOs(chatMessages);
  58. return chatMessageDTOs;
  59. }
  60. @Override
  61. @Transactional(readOnly = true)
  62. public List<ReencryptionDTO> getAllMessagesForReencryption(
  63. final String fromUser, final String toUser) {
  64. return myConversionService.convertToReencryptionDTOs(
  65. chatMessageRepository.getAllMessages(fromUser, toUser));
  66. }
  67. @Override
  68. @Transactional(readOnly = true)
  69. public List<ChatMessageDTO> getMessagePage(final String fromUser,
  70. final String toUser, final int page, final int size) {
  71. return myConversionService.convertToChatMessageDTOs(
  72. chatMessageRepository.getAllMessages(fromUser, toUser,
  73. PageRequest.of(page, size)));
  74. }
  75. @Override
  76. @Transactional(readOnly = true)
  77. public List<ChatMessageDTO> getNewMessages(final String fromUser,
  78. final String toUser, final Date lastMessageTime) {
  79. final List<ChatMessage> chatMessages = chatMessageRepository
  80. .getNewMessages(fromUser, toUser, lastMessageTime);
  81. return myConversionService.convertToChatMessageDTOs(chatMessages);
  82. }
  83. @Override
  84. public void reencryptMessages(
  85. final List<ReencryptionDTO> reencryptionDTOs) {
  86. final List<MessageCipher> messageCiphers = reencryptionDTOs.stream()
  87. .map(reencryptionDTO -> reencryptionDTO.getMessageCipher())
  88. .collect(Collectors.toList());
  89. messageCipherRepository.saveAll(messageCiphers);
  90. }
  91. }