UserInteractionService.java 4.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package cn.seecoder.seecoderbokserver.service;
  2. import cn.seecoder.bok.common.dto.CollectDTO;
  3. import cn.seecoder.bok.common.dto.RateDTO;
  4. import cn.seecoder.seecoderbokserver.domain.Interaction;
  5. import cn.seecoder.seecoderbokserver.domain.Question;
  6. import cn.seecoder.seecoderbokserver.repository.InteractionRepository;
  7. import org.springframework.data.domain.Page;
  8. import org.springframework.data.domain.PageImpl;
  9. import org.springframework.data.domain.Pageable;
  10. import org.springframework.stereotype.Service;
  11. import javax.transaction.Transactional;
  12. import java.util.Collection;
  13. import java.util.List;
  14. import java.util.Optional;
  15. import java.util.stream.Collectors;
  16. import java.util.stream.StreamSupport;
  17. import static org.springframework.data.jpa.domain.Specification.where;
  18. /**
  19. * @author Kunduin
  20. */
  21. @Service
  22. @Transactional(rollbackOn = RuntimeException.class)
  23. public class UserInteractionService {
  24. private final InteractionRepository interactionRepository;
  25. private final QuestionService questionService;
  26. public UserInteractionService(InteractionRepository collectionInteractionRepository, QuestionService questionService) {
  27. this.interactionRepository = collectionInteractionRepository;
  28. this.questionService = questionService;
  29. }
  30. public Interaction collectQuestion(String userId, String questionId, CollectDTO collectDTO) {
  31. return interactionRepository.findByUserIdAndQuestionId(userId, questionId)
  32. .map(interaction -> {
  33. interaction.setCollection(collectDTO.getCollect());
  34. return interactionRepository.save(interaction);
  35. })
  36. .orElseGet(() -> {
  37. Interaction interaction = new Interaction();
  38. interaction.setUserId(userId);
  39. interaction.setQuestionId(questionId);
  40. interaction.setCollection(collectDTO.getCollect());
  41. return interactionRepository.save(interaction);
  42. });
  43. }
  44. public Interaction rateQuestion(String userId, String questionId, RateDTO rateDTO) {
  45. return interactionRepository.findByUserIdAndQuestionId(userId, questionId)
  46. .map(interaction -> {
  47. interaction.setRate(rateDTO.getRate());
  48. return interactionRepository.save(interaction);
  49. })
  50. .orElseGet(() -> {
  51. Interaction interaction = new Interaction();
  52. interaction.setUserId(userId);
  53. interaction.setQuestionId(questionId);
  54. interaction.setRate(rateDTO.getRate());
  55. return interactionRepository.save(interaction);
  56. });
  57. }
  58. public Page<Question> getUserInteractiveQuestions(String userId, Boolean collect, Boolean rate, Pageable pageable) {
  59. Page<Interaction> interactions = interactionRepository.findAll(
  60. where(interactionRepository.byUser(userId))
  61. .and(interactionRepository.hasCollected(collect))
  62. .and(interactionRepository.hasRated(rate)), pageable);
  63. List<String> questionIds = interactions.getContent().stream()
  64. .map(Interaction::getQuestionId).collect(Collectors.toList());
  65. Iterable<Question> questions = questionService.findAllById(questionIds);
  66. List<Question> questionList = StreamSupport.stream(questions.spliterator(), false)
  67. .collect(Collectors.toList());
  68. return new PageImpl<>(questionList, pageable, interactions.getTotalElements());
  69. }
  70. public Optional<Interaction> getUserInteractiveQuestion(String userId, String questionId) {
  71. return interactionRepository.findByUserIdAndQuestionId(userId, questionId);
  72. }
  73. public List<Interaction> getUserInteractiveQuestionIn(String userId, List<String> questionIdList) {
  74. return interactionRepository.findAll(where(interactionRepository.byUser(userId))
  75. .and(interactionRepository.inQuestions(questionIdList)));
  76. }
  77. @Transactional(rollbackOn = Exception.class)
  78. public List<Interaction> saveAll(Collection<Interaction> interactions) {
  79. return interactionRepository.saveAll(interactions);
  80. }
  81. }