SeecoderBokClient.java 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. package cn.seecoder.bok.client;
  2. import cn.seecoder.bok.common.QuestionType;
  3. import cn.seecoder.bok.common.api.*;
  4. import cn.seecoder.bok.common.dto.CollectDTO;
  5. import cn.seecoder.bok.common.dto.RateDTO;
  6. import cn.seecoder.bok.common.utility.RestPage;
  7. import cn.seecoder.bok.common.vo.*;
  8. import com.fasterxml.jackson.core.type.TypeReference;
  9. import okhttp3.HttpUrl;
  10. import okhttp3.Response;
  11. import org.springframework.data.domain.Page;
  12. import org.springframework.data.domain.Pageable;
  13. import javax.validation.constraints.NotBlank;
  14. import javax.validation.constraints.NotNull;
  15. import java.util.Collections;
  16. import java.util.List;
  17. import java.util.Optional;
  18. import java.util.stream.Collectors;
  19. import static cn.seecoder.bok.client.ParamUtil.*;
  20. /**
  21. * @author kunduin
  22. */
  23. public class SeecoderBokClient
  24. implements SeecoderBokQuestionApi, SeecoderBokQuestionQueryApi,
  25. SeecoderBokRecordApi, SeecoderBokUserInteractiveApi,
  26. SeecoderBokKnowledgeApi {
  27. private final OkRequest req;
  28. /**
  29. * 创建client
  30. *
  31. * @param host bok地址,示例:{@code "http://bok.seecoder.cn"}
  32. */
  33. public SeecoderBokClient(String host) {
  34. req = new OkRequest(host);
  35. }
  36. @Override
  37. @Deprecated
  38. public List<KnowledgeNodeVO> getKnowledgeNode(String name) {
  39. HttpUrl httpUrl = req.createUrlBuilder("/api/knowledge")
  40. .addQueryParameter("name", name).build();
  41. Response response = req.get(httpUrl);
  42. return req.getResponseBody(response, new TypeReference<List<KnowledgeNodeVO>>() {})
  43. .orElse(Collections.emptyList());
  44. }
  45. @Override
  46. public Page<QuestionVO> getQuestionList(String stem, List<String> tags,
  47. List<QuestionType> types, List<Integer> weights,
  48. List<String> knowledgeIds, Pageable pageable) {
  49. HttpUrl.Builder urlBuilder = req.createUrlBuilder("/api/question")
  50. .addQueryParameter("stem", stem)
  51. .addQueryParameter("tag", joinComma(tags))
  52. .addQueryParameter("knowledgeId", joinComma(knowledgeIds))
  53. .addQueryParameter("type", joinComma(types != null ? types.stream().map(Enum::toString).collect(Collectors.toList()) : Collections.emptyList()))
  54. .addQueryParameter("weight", joinComma(weights != null ? weights.stream().map(String::valueOf).collect(Collectors.toList()) : Collections.emptyList()));
  55. return getQuestionVOS(pageable, urlBuilder);
  56. }
  57. @Override
  58. public QuestionVO createQuestion(@NotNull QuestionVO question) {
  59. HttpUrl httpUrl = req.createUrlBuilder("/api/question").build();
  60. Response response = req.post(httpUrl, req.writeRequestBody(question));
  61. return req.getResponseBody(response, QuestionVO.class).orElseThrow(() -> SeecoderBokException.UNWRAP_EXCEPTION);
  62. }
  63. @Override
  64. public List<QuestionVO> createQuestions(@NotNull List<QuestionVO> questionVOS) {
  65. HttpUrl httpUrl = req.createUrlBuilder("/api/questions").build();
  66. Response response = req.post(httpUrl, req.writeRequestBody(questionVOS));
  67. return req.getResponseBody(response, new TypeReference<List<QuestionVO>>() {})
  68. .orElseThrow(() -> SeecoderBokException.UNWRAP_EXCEPTION);
  69. }
  70. @Override
  71. public Optional<QuestionVO> getQuestionById(@NotBlank String questionId) {
  72. HttpUrl httpUrl = req.createUrlBuilder(formatUrl("/api/question/{0}", encodeValue(questionId))).build();
  73. Response response = req.get(httpUrl);
  74. return req.getResponseBody(response, QuestionVO.class);
  75. }
  76. @Override
  77. public QuestionVO updateQuestion(@NotNull QuestionVO question) {
  78. HttpUrl httpUrl = req.createUrlBuilder(formatUrl("/api/question/{0}", encodeValue(question.getId()))).build();
  79. Response response = req.put(httpUrl, req.writeRequestBody(question));
  80. return req.getResponseBody(response, QuestionVO.class).orElseThrow(() -> SeecoderBokException.UNWRAP_EXCEPTION);
  81. }
  82. @Override
  83. public void deleteQuestionById(@NotBlank String questionId) {
  84. HttpUrl httpUrl = req.createUrlBuilder(formatUrl("/api/question/{0}", questionId)).build();
  85. req.delete(httpUrl);
  86. }
  87. @Override
  88. public List<QuestionVO> getQuestionListByIds(@NotNull List<String> ids) {
  89. HttpUrl httpUrl = req.createUrlBuilder("/api/question-query/id")
  90. .addQueryParameter("id", joinComma(ids))
  91. .build();
  92. Response response = req.get(httpUrl);
  93. return req.getResponseBody(response, new TypeReference<List<QuestionVO>>() {})
  94. .orElse(Collections.emptyList());
  95. }
  96. @Override
  97. public List<RecordVO> createUserRecord(@NotNull List<RecordVO> records) {
  98. HttpUrl httpUrl = req.createUrlBuilder("/api/record").build();
  99. Response response = req.post(httpUrl, req.writeRequestBody(records));
  100. return req.getResponseBody(response, new TypeReference<List<RecordVO>>() {})
  101. .orElse(Collections.emptyList());
  102. }
  103. @Override
  104. public Page<RecordVO> getUserRecord(
  105. List<String> userIdList,
  106. List<String> questionIdList,
  107. List<String> recordIdList,
  108. Pageable pageable) {
  109. HttpUrl.Builder urlBuilder = req.createUrlBuilder("/api/record")
  110. .addQueryParameter("userId", joinComma(userIdList))
  111. .addQueryParameter("questionId", joinComma(questionIdList))
  112. .addQueryParameter("recordId", joinComma(recordIdList));
  113. HttpUrl httpUrl = addPageableToParams(urlBuilder, pageable).build();
  114. Response response = req.get(httpUrl);
  115. return req.getResponseBody(response, new TypeReference<RestPage<RecordVO>>() {})
  116. .orElse(new RestPage<>());
  117. }
  118. @Override
  119. public RecordQuestionVO getUserRecordQuestions(
  120. @NotNull String userId, Pageable pageable) {
  121. HttpUrl.Builder urlBuilder = req.createUrlBuilder(formatUrl("/api/record/{0}/question", userId));
  122. HttpUrl httpUrl = addPageableToParams(urlBuilder, pageable).build();
  123. Response response = req.get(httpUrl);
  124. return req.getResponseBody(response, RecordQuestionVO.class)
  125. .orElse(RecordQuestionVO.empty());
  126. }
  127. @Override
  128. public void collectQuestion(
  129. @NotBlank String userId, @NotBlank String questionId, @NotNull CollectDTO collectDTO) {
  130. HttpUrl httpUrl = req.createUrlBuilder(
  131. formatUrl("/api/user/{0}/question/{1}/collection", userId, questionId)).build();
  132. req.post(httpUrl, req.writeRequestBody(collectDTO));
  133. }
  134. @Override
  135. public void rateQuestion(
  136. @NotBlank String userId, @NotBlank String questionId, @NotNull RateDTO rateDTO) {
  137. HttpUrl httpUrl = req.createUrlBuilder(
  138. formatUrl("/api/user/{0}/question/{1}/rate", userId, questionId)).build();
  139. req.post(httpUrl, req.writeRequestBody(rateDTO));
  140. }
  141. @Override
  142. public Page<QuestionVO> getUserInteractiveQuestions(
  143. @NotBlank String userId, Boolean collect, Boolean rate, Pageable pageable) {
  144. HttpUrl.Builder urlBuilder = req.createUrlBuilder(formatUrl("/api/user/{0}/question", userId))
  145. .addQueryParameter("collection", String.valueOf(collect))
  146. .addQueryParameter("rate", String.valueOf(rate));
  147. return getQuestionVOS(pageable, urlBuilder);
  148. }
  149. @Override
  150. public Optional<InteractionVO> getUserInteractiveQuestion(
  151. @NotBlank String userId, @NotBlank String questionId) {
  152. HttpUrl httpUrl = req.createUrlBuilder(
  153. formatUrl("/api/user/{0}/question/{1}", userId, questionId)).build();
  154. Response response = req.get(httpUrl);
  155. return req.getResponseBody(response, InteractionVO.class);
  156. }
  157. @Override
  158. public List<InteractionVO> getUserInteractiveQuestionIn(
  159. @NotBlank String userId, List<String> questionIdList) {
  160. HttpUrl httpUrl = req.createUrlBuilder(
  161. formatUrl("/api/user/{0}/questionInList", userId)).build();
  162. Response response = req.get(httpUrl);
  163. return req.getResponseBody(response, new TypeReference<List<InteractionVO>>() {})
  164. .orElse(Collections.emptyList());
  165. }
  166. @Override
  167. public List<InteractionVO> getAllInteractionQuestions() {
  168. HttpUrl httpUrl = req.createUrlBuilder(
  169. formatUrl("/api/user/allInteractions")).build();
  170. Response response = req.get(httpUrl);
  171. return req.getResponseBody(response, new TypeReference<List<InteractionVO>>() {})
  172. .orElse(Collections.emptyList());
  173. }
  174. private Page<QuestionVO> getQuestionVOS(Pageable pageable, HttpUrl.Builder urlBuilder) {
  175. HttpUrl httpUrl = addPageableToParams(urlBuilder, pageable).build();
  176. Response response = req.get(httpUrl);
  177. return req.getResponseBody(response, new TypeReference<RestPage<QuestionVO>>() {})
  178. .orElse(new RestPage<>());
  179. }
  180. private HttpUrl.Builder addPageableToParams(HttpUrl.Builder builder, Pageable pageable) {
  181. return Optional.ofNullable(pageable)
  182. .map(notNullPageable ->
  183. builder.addQueryParameter("page", String.valueOf(notNullPageable.getPageNumber()))
  184. .addQueryParameter("sort", parseSort(notNullPageable.getSort()))
  185. .addQueryParameter("size", String.valueOf(notNullPageable.getPageSize()))
  186. )
  187. .orElse(builder);
  188. }
  189. }