UserInteractionController.java 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package cn.seecoder.seecoderbokserver.web.rest;
  2. import cn.seecoder.bok.common.api.SeecoderBokUserInteractiveApi;
  3. import cn.seecoder.bok.common.dto.CollectDTO;
  4. import cn.seecoder.bok.common.dto.RateDTO;
  5. import cn.seecoder.bok.common.vo.InteractionVO;
  6. import cn.seecoder.bok.common.vo.QuestionVO;
  7. import cn.seecoder.seecoderbokserver.domain.Interaction;
  8. import cn.seecoder.seecoderbokserver.mapper.InteractionMapper;
  9. import cn.seecoder.seecoderbokserver.mapper.QuestionMapper;
  10. import cn.seecoder.seecoderbokserver.service.UserInteractionService;
  11. import org.springframework.data.domain.Page;
  12. import org.springframework.data.domain.Pageable;
  13. import org.springframework.web.bind.annotation.*;
  14. import javax.validation.Valid;
  15. import javax.validation.constraints.NotBlank;
  16. import javax.validation.constraints.NotNull;
  17. import java.io.IOException;
  18. import java.nio.file.Files;
  19. import java.nio.file.Paths;
  20. import java.util.List;
  21. import java.util.Optional;
  22. import java.util.function.Function;
  23. import java.util.stream.Collectors;
  24. /**
  25. * @author Kunduin
  26. */
  27. @RestController
  28. @RequestMapping("/api/user")
  29. public class UserInteractionController implements SeecoderBokUserInteractiveApi {
  30. private final UserInteractionService interactionService;
  31. private final QuestionMapper questionMapper;
  32. private final InteractionMapper interactionMapper;
  33. public UserInteractionController(UserInteractionService interactionService, QuestionMapper questionMapper, InteractionMapper interactionMapper) {
  34. this.interactionService = interactionService;
  35. this.questionMapper = questionMapper;
  36. this.interactionMapper = interactionMapper;
  37. }
  38. @Override
  39. @PostMapping("/{userId}/question/{questionId}/collection")
  40. public void collectQuestion(
  41. @PathVariable("userId") @Valid @NotBlank String userId,
  42. @PathVariable("questionId") @Valid @NotBlank String questionId,
  43. @RequestBody @Valid @NotNull CollectDTO collectDTO) {
  44. interactionService.collectQuestion(userId, questionId, collectDTO);
  45. }
  46. @Override
  47. @PostMapping("/{userId}/question/{questionId}/rate")
  48. public void rateQuestion(
  49. @PathVariable("userId") @Valid @NotBlank String userId,
  50. @PathVariable("questionId") @Valid @NotBlank String questionId,
  51. @RequestBody @Valid @NotNull RateDTO rateDTO) {
  52. interactionService.rateQuestion(userId, questionId, rateDTO);
  53. }
  54. @Override
  55. @GetMapping("/{userId}/question")
  56. public Page<QuestionVO> getUserInteractiveQuestions(
  57. @PathVariable("userId") @Valid @NotBlank String userId,
  58. @RequestParam(value = "collection", required = false) Boolean collect,
  59. @RequestParam(value = "rate", required = false) Boolean rate,
  60. Pageable pageable) {
  61. return interactionService.getUserInteractiveQuestions(userId, collect, rate, pageable)
  62. .map(questionMapper::questionToQuestionVO);
  63. }
  64. @Override
  65. @GetMapping("/{userId}/question/{questionId}")
  66. public Optional<InteractionVO> getUserInteractiveQuestion(
  67. @PathVariable("userId") @Valid @NotBlank String userId,
  68. @PathVariable("questionId") @Valid @NotBlank String questionId) {
  69. return interactionService.getUserInteractiveQuestion(userId, questionId)
  70. .map(interactionMapper::interactionToInteractionVO);
  71. }
  72. @Override
  73. @GetMapping("/{userId}/questionInList")
  74. public List<InteractionVO> getUserInteractiveQuestionIn(
  75. @PathVariable("userId") @Valid @NotBlank String userId,
  76. @RequestParam(value = "questionId", required = false) List<String> questionIdList) {
  77. return interactionService.getUserInteractiveQuestionIn(userId, questionIdList)
  78. .stream().map(interactionMapper::interactionToInteractionVO).collect(Collectors.toList());
  79. }
  80. @GetMapping("/init")
  81. public void init() {
  82. List<String> collectRaw = null;
  83. List<String> rateRaw = null;
  84. try {
  85. collectRaw = Files.readAllLines(Paths.get("C:\\Users\\Kunduin\\Downloads\\interactive_collect.csv"));
  86. rateRaw = Files.readAllLines(Paths.get("C:\\Users\\Kunduin\\Downloads\\interactive_rate.csv"));
  87. } catch (IOException e) {
  88. e.printStackTrace();
  89. }
  90. assert collectRaw != null;
  91. List<String> collectLines = collectRaw.subList(1, collectRaw.size());
  92. assert rateRaw != null;
  93. List<String> rateLines = rateRaw.subList(1, rateRaw.size());
  94. Function<String, String> removeQuotation = raw -> raw.substring(1, raw.length() - 1);
  95. List<Interaction> collectionInteractions = collectLines.stream().map(raw -> {
  96. String[] items = raw.split(",");
  97. Interaction interaction = new Interaction();
  98. interaction.setQuestionId(removeQuotation.apply(items[0]));
  99. interaction.setUserId(removeQuotation.apply(items[1]));
  100. interaction.setCollection(Boolean.parseBoolean(removeQuotation.apply(items[2])));
  101. return interaction;
  102. }).collect(Collectors.toList());
  103. List<Interaction> ratingWithCollectionInteractions = rateLines.stream().map(raw -> {
  104. String[] items = raw.split(",");
  105. Interaction ratingInteractions = new Interaction();
  106. ratingInteractions.setQuestionId(removeQuotation.apply(items[0]));
  107. ratingInteractions.setUserId(removeQuotation.apply(items[1]));
  108. ratingInteractions.setRate(Integer.parseInt(removeQuotation.apply(items[2])));
  109. collectionInteractions.stream()
  110. .filter(interaction -> interaction.getQuestionId().equals(ratingInteractions.getQuestionId())
  111. && interaction.getUserId().equals(ratingInteractions.getUserId()))
  112. .findFirst().ifPresent(interaction -> ratingInteractions.setCollection(interaction.getCollection()));
  113. return ratingInteractions;
  114. }).collect(Collectors.toList());
  115. List<Interaction> collectResult = collectionInteractions.stream().filter(interaction -> {
  116. long size = ratingWithCollectionInteractions.parallelStream()
  117. .filter(rateInteraction -> interaction.getUserId().equals(rateInteraction.getUserId())
  118. && interaction.getQuestionId().equals(rateInteraction.getQuestionId()))
  119. .count();
  120. return size == 0;
  121. }).collect(Collectors.toList());
  122. ratingWithCollectionInteractions.addAll(collectResult);
  123. interactionService.saveAll(ratingWithCollectionInteractions);
  124. }
  125. }