UserInteractionController.java 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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. @Override
  81. @GetMapping("/allInteractions")
  82. public List<InteractionVO> getAllInteractionQuestions() {
  83. return interactionService.getAll().stream().map(interactionMapper::interactionToInteractionVO).collect(Collectors.toList());
  84. }
  85. @GetMapping("/init")
  86. public void init() {
  87. List<String> collectRaw = null;
  88. List<String> rateRaw = null;
  89. try {
  90. collectRaw = Files.readAllLines(Paths.get("C:\\Users\\Kunduin\\Downloads\\interactive_collect.csv"));
  91. rateRaw = Files.readAllLines(Paths.get("C:\\Users\\Kunduin\\Downloads\\interactive_rate.csv"));
  92. } catch (IOException e) {
  93. e.printStackTrace();
  94. }
  95. assert collectRaw != null;
  96. List<String> collectLines = collectRaw.subList(1, collectRaw.size());
  97. assert rateRaw != null;
  98. List<String> rateLines = rateRaw.subList(1, rateRaw.size());
  99. Function<String, String> removeQuotation = raw -> raw.substring(1, raw.length() - 1);
  100. List<Interaction> collectionInteractions = collectLines.stream().map(raw -> {
  101. String[] items = raw.split(",");
  102. Interaction interaction = new Interaction();
  103. interaction.setQuestionId(removeQuotation.apply(items[0]));
  104. interaction.setUserId(removeQuotation.apply(items[1]));
  105. interaction.setCollection(Boolean.parseBoolean(removeQuotation.apply(items[2])));
  106. return interaction;
  107. }).collect(Collectors.toList());
  108. List<Interaction> ratingWithCollectionInteractions = rateLines.stream().map(raw -> {
  109. String[] items = raw.split(",");
  110. Interaction ratingInteractions = new Interaction();
  111. ratingInteractions.setQuestionId(removeQuotation.apply(items[0]));
  112. ratingInteractions.setUserId(removeQuotation.apply(items[1]));
  113. ratingInteractions.setRate(Integer.parseInt(removeQuotation.apply(items[2])));
  114. collectionInteractions.stream()
  115. .filter(interaction -> interaction.getQuestionId().equals(ratingInteractions.getQuestionId())
  116. && interaction.getUserId().equals(ratingInteractions.getUserId()))
  117. .findFirst().ifPresent(interaction -> ratingInteractions.setCollection(interaction.getCollection()));
  118. return ratingInteractions;
  119. }).collect(Collectors.toList());
  120. List<Interaction> collectResult = collectionInteractions.stream().filter(interaction -> {
  121. long size = ratingWithCollectionInteractions.parallelStream()
  122. .filter(rateInteraction -> interaction.getUserId().equals(rateInteraction.getUserId())
  123. && interaction.getQuestionId().equals(rateInteraction.getQuestionId()))
  124. .count();
  125. return size == 0;
  126. }).collect(Collectors.toList());
  127. ratingWithCollectionInteractions.addAll(collectResult);
  128. interactionService.saveAll(ratingWithCollectionInteractions);
  129. }
  130. }