From 223d951d62ef14eb2135f33a19b253afaf4a93d2 Mon Sep 17 00:00:00 2001 From: YuCheng Hu Date: Wed, 4 Oct 2023 10:23:35 -0400 Subject: [PATCH] =?UTF-8?q?ZCH-19=20=E6=9B=B4=E6=96=B0=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=A4=84=E7=90=86=E4=BB=A3=E7=A0=81=EF=BC=8C=E5=B9=B6=E4=B8=94?= =?UTF-8?q?=E5=AF=B9=E5=88=9B=E5=BB=BA=E7=9A=84=20API=20=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../discourse/client/DiscourseClient.java | 11 +++ .../client/service/TopicsService.java | 42 +++++++++++ .../client/test/PostsServiceTest.java | 7 +- .../ossez/discourse/client/test/TestBase.java | 5 +- .../client/test/TopicServiceTest.java | 26 ++++++- .../exception/DataStructureException.java | 34 ++++++--- .../common/exception/DiscourseError.java | 70 ++++++------------- .../exception/DiscourseErrorException.java | 36 ++++++++++ .../exception/DiscourseRuntimeException.java | 28 ++++++++ .../common/exception/WxErrorException.java | 35 ---------- .../common/exception/WxRuntimeException.java | 23 ------ .../discourse/common/model/dto/Creation.java | 51 ++++++++++++++ .../common/model/dto/PostCreation.java | 33 +++++++++ .../common/model/dto/TopicCreation.java | 32 +++++++++ .../common/model/req/DataCubeRequest.java | 25 ++++--- 15 files changed, 319 insertions(+), 139 deletions(-) create mode 100644 common/src/main/java/com/ossez/discourse/common/exception/DiscourseErrorException.java create mode 100644 common/src/main/java/com/ossez/discourse/common/exception/DiscourseRuntimeException.java delete mode 100644 common/src/main/java/com/ossez/discourse/common/exception/WxErrorException.java delete mode 100644 common/src/main/java/com/ossez/discourse/common/exception/WxRuntimeException.java create mode 100644 common/src/main/java/com/ossez/discourse/common/model/dto/Creation.java create mode 100644 common/src/main/java/com/ossez/discourse/common/model/dto/PostCreation.java create mode 100644 common/src/main/java/com/ossez/discourse/common/model/dto/TopicCreation.java diff --git a/client/src/main/java/com/ossez/discourse/client/DiscourseClient.java b/client/src/main/java/com/ossez/discourse/client/DiscourseClient.java index 2da05ab..f3fb1f0 100644 --- a/client/src/main/java/com/ossez/discourse/client/DiscourseClient.java +++ b/client/src/main/java/com/ossez/discourse/client/DiscourseClient.java @@ -4,6 +4,7 @@ package com.ossez.discourse.client; import com.fasterxml.jackson.databind.ObjectMapper; import okhttp3.HttpUrl; import okhttp3.Request; +import okhttp3.RequestBody; /** * @@ -23,4 +24,14 @@ public abstract class DiscourseClient { return request; } + public Request postRequest(String path, RequestBody body) { + HttpUrl.Builder urlBuilder = HttpUrl.parse(site_url + path).newBuilder(); + Request request = new Request.Builder().url(urlBuilder.build().toString()) + .addHeader("api-username", api_username) + .addHeader("api-key", api_key) + .post(body) + .build(); + return request; + } + } diff --git a/client/src/main/java/com/ossez/discourse/client/service/TopicsService.java b/client/src/main/java/com/ossez/discourse/client/service/TopicsService.java index 7885a62..30e71ef 100644 --- a/client/src/main/java/com/ossez/discourse/client/service/TopicsService.java +++ b/client/src/main/java/com/ossez/discourse/client/service/TopicsService.java @@ -3,8 +3,12 @@ package com.ossez.discourse.client.service; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategy; +import com.ossez.discourse.common.exception.DiscourseError; +import com.ossez.discourse.common.exception.DiscourseRuntimeException; +import com.ossez.discourse.common.model.dto.Post; import com.ossez.discourse.common.model.dto.Topic; import com.ossez.discourse.client.DiscourseClient; +import com.ossez.discourse.common.model.dto.TopicCreation; import okhttp3.*; import org.apache.http.HttpStatus; import org.slf4j.Logger; @@ -55,5 +59,43 @@ public class TopicsService extends DiscourseClient { return discourseTopic; } + public Optional createTopic(TopicCreation topicCreation) { + String path = "/posts.json"; + + Optional topic = Optional.ofNullable(new Topic()); + Optional post = Optional.ofNullable(new Post()); + + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); + try { + RequestBody body = RequestBody.create( + MediaType.parse("application/json"), objectMapper.writeValueAsString(topicCreation)); + Response response = client.newCall(postRequest(path, body)).execute(); + + String responseStr = response.body().string(); + + log.debug("PROCESS CREATE RESPONSE CODE AND STR - [{}]", response.code()); + + if (response.code() == HttpStatus.SC_OK) { + /* + When you create a Topic, the Discourse API will return a Post Object. + The function in here try to create a topic, so we can get topicId and do search again to get topic details. + */ + + post = Optional.of(objectMapper.readValue(responseStr, Post.class)); + if (post.isPresent()) { + topic = getTopic(post.get().getTopicId()); + } + } else { + throw new DiscourseRuntimeException(responseStr); + } + } catch (IOException e) { + throw new DiscourseRuntimeException(e); + } + + return topic; + } + } diff --git a/client/src/test/java/com/ossez/discourse/client/test/PostsServiceTest.java b/client/src/test/java/com/ossez/discourse/client/test/PostsServiceTest.java index 554fe6e..38549b6 100644 --- a/client/src/test/java/com/ossez/discourse/client/test/PostsServiceTest.java +++ b/client/src/test/java/com/ossez/discourse/client/test/PostsServiceTest.java @@ -2,8 +2,7 @@ package com.ossez.discourse.client.test; import com.google.inject.Inject; import com.ossez.discourse.client.service.PostsService; -import com.ossez.discourse.client.service.TopicsService; -import com.ossez.discourse.common.exception.WxErrorException; +import com.ossez.discourse.common.exception.DiscourseErrorException; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; @@ -24,10 +23,10 @@ public class PostsServiceTest extends TestBase { /** * Test Create Menu * - * @throws WxErrorException + * @throws DiscourseErrorException */ @Test - public void testCreate() throws WxErrorException { + public void testCreate() throws DiscourseErrorException { log.debug("Create WeChat Offical Account Menun Test"); log.debug("{}", postsService.getPost(Long.valueOf("1245")).get().getRaw()); diff --git a/client/src/test/java/com/ossez/discourse/client/test/TestBase.java b/client/src/test/java/com/ossez/discourse/client/test/TestBase.java index f4da9d3..a94f830 100644 --- a/client/src/test/java/com/ossez/discourse/client/test/TestBase.java +++ b/client/src/test/java/com/ossez/discourse/client/test/TestBase.java @@ -22,9 +22,11 @@ import java.util.Properties; */ public class TestBase { private static final Logger log = LoggerFactory.getLogger(TestBase.class); - private static final String TEST_CONFIG_PROPERTIES= "test-config.properties"; + private static final String TEST_CONFIG_PROPERTIES = "test-config.properties"; public static final Long DISCOURSE_POST_ID = 594L; public static final Long DISCOURSE_TOPIC_ID = 570L; + public static final String DISCOURSE_TOPIC_TITLE = "ZCHub Discourse API Test"; + public static final String DISCOURSE_TOPIC_TITLE_CREATE = "ZCHub Discourse API Test - CREATE"; @BeforeAll public void setup() { @@ -87,5 +89,4 @@ public class TestBase { }); - } diff --git a/client/src/test/java/com/ossez/discourse/client/test/TopicServiceTest.java b/client/src/test/java/com/ossez/discourse/client/test/TopicServiceTest.java index 7a4c45a..ee38055 100644 --- a/client/src/test/java/com/ossez/discourse/client/test/TopicServiceTest.java +++ b/client/src/test/java/com/ossez/discourse/client/test/TopicServiceTest.java @@ -2,8 +2,9 @@ package com.ossez.discourse.client.test; import com.google.inject.Inject; import com.ossez.discourse.client.service.TopicsService; -import com.ossez.discourse.common.exception.WxErrorException; +import com.ossez.discourse.common.exception.DiscourseErrorException; import com.ossez.discourse.common.model.dto.Topic; +import com.ossez.discourse.common.model.dto.TopicCreation; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; @@ -28,10 +29,10 @@ public class TopicServiceTest extends TestBase { /** * Test Create Menu * - * @throws WxErrorException + * @throws DiscourseErrorException */ @Test - public void testCreate() throws WxErrorException { + public void testGetTopic() throws DiscourseErrorException { log.debug("Create WeChat Offical Account Menun Test"); Optional topic = topicsService.getTopic(DISCOURSE_TOPIC_ID); assertThat(topic).isNotEmpty(); @@ -45,4 +46,23 @@ public class TopicServiceTest extends TestBase { } + @Test + public void testCreateTopic() throws DiscourseErrorException { +// log.debug("Create Discourse Topic for Testing"); +// TopicCreation topicCreation = new TopicCreation(); +// topicCreation.setTitle(DISCOURSE_TOPIC_TITLE_CREATE); +// topicCreation.setCategory(3); +// topicCreation.setRaw(DISCOURSE_TOPIC_TITLE_CREATE); +// +// Optional topic = topicsService.createTopic(topicCreation); +// assertThat(topic).isNotEmpty(); +// +// log.debug("Created Topic Id - [{}]", topic.get().getId()); +// +// assertThat(topic.get().getId()).isGreaterThan(0); +// assertThat(topic.get().getPostStream().getPosts().get(0).getId()).isGreaterThan(0); +// assertThat(topic.get().getTitle()).isEqualTo(DISCOURSE_TOPIC_TITLE_CREATE); +// log.debug("{}", topic.get().getTitle()); + } + } diff --git a/common/src/main/java/com/ossez/discourse/common/exception/DataStructureException.java b/common/src/main/java/com/ossez/discourse/common/exception/DataStructureException.java index ede8ee1..51d10e2 100644 --- a/common/src/main/java/com/ossez/discourse/common/exception/DataStructureException.java +++ b/common/src/main/java/com/ossez/discourse/common/exception/DataStructureException.java @@ -3,24 +3,36 @@ package com.ossez.discourse.common.exception; /** * @author Daniel Qian */ -public class DataStructureException extends WxErrorException { +public class DataStructureException extends DiscourseErrorException { private static final long serialVersionUID = -6357149550353160810L; - private final DiscourseError error; +// private final DiscourseError error; private static final int DEFAULT_ERROR_CODE = -99; - public DataStructureException(String message) { - this(DiscourseError.builder().errorCode(DEFAULT_ERROR_CODE).errorMsg(message).build()); - } - public DataStructureException(DiscourseError error) { - super(error.toString()); - this.error = error; + super(error); } - - public DiscourseError getError() { - return this.error; + public DataStructureException(DiscourseError error, Throwable cause) { + super(error, cause); } + + public DataStructureException(Throwable cause, DiscourseError error) { + super(cause, error); + } + +// public DataStructureException(String message, DiscourseError error) { +//// this(DiscourseError.builder().errorCode(DEFAULT_ERROR_CODE).errorMsg(message).build()); +// } + +// public DataStructureException(DiscourseError error) { +// super(error.toString()); +// this.error = error; +// } + + +// public DiscourseError getError() { +// return this.error; +// } } diff --git a/common/src/main/java/com/ossez/discourse/common/exception/DiscourseError.java b/common/src/main/java/com/ossez/discourse/common/exception/DiscourseError.java index e6be041..f8fdeb0 100644 --- a/common/src/main/java/com/ossez/discourse/common/exception/DiscourseError.java +++ b/common/src/main/java/com/ossez/discourse/common/exception/DiscourseError.java @@ -1,62 +1,36 @@ package com.ossez.discourse.common.exception; -import com.ossez.discourse.common.enums.WeChatErrorCode; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import com.ossez.discourse.common.enums.WxType; -import org.apache.commons.lang3.StringUtils; - import java.io.Serializable; +import java.util.List; -/** - * 微信错误码. - * 请阅读: - * 公众平台:全局返回码说明 - * 企业微信:全局错误码 - * - * @author Daniel Qian & Binary Wang - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder public class DiscourseError implements Serializable { private static final long serialVersionUID = -2696724276555657960L; - /** - * 微信错误代码. - */ - private int errorCode; + private String action; + private List errors; - /** - * 微信错误信息. - * (如果可以翻译为中文,就为中文) - */ - private String errorMsg; - - /** - * 微信接口返回的错误原始信息(英文). - */ - private String errorMsgEn; - - private String json; - - public DiscourseError(int errorCode, String errorMsg) { - this.errorCode = errorCode; - this.errorMsg = errorMsg; + public DiscourseError(String action, List errors) { + this.action = action; + this.errors = errors; } + public DiscourseError() { - - @Override - public String toString() { - if (this.json == null) { - return "错误代码:" + this.errorCode + ", 错误信息:" + this.errorMsg; - } - - return "错误代码:" + this.errorCode + ", 错误信息:" + this.errorMsg + ",微信原始报文:" + this.json; } + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public List getErrors() { + return errors; + } + + public void setErrors(List errors) { + this.errors = errors; + } } diff --git a/common/src/main/java/com/ossez/discourse/common/exception/DiscourseErrorException.java b/common/src/main/java/com/ossez/discourse/common/exception/DiscourseErrorException.java new file mode 100644 index 0000000..c5c78fa --- /dev/null +++ b/common/src/main/java/com/ossez/discourse/common/exception/DiscourseErrorException.java @@ -0,0 +1,36 @@ +package com.ossez.discourse.common.exception; + +/** + * @author Daniel Qian + */ +public class DiscourseErrorException extends Exception { + private static final long serialVersionUID = -6357149550353160810L; + + private final DiscourseError error; + + private static final int DEFAULT_ERROR_CODE = -99; + +// public WxErrorException(String message) { +// this(DiscourseError.builder().errorCode(DEFAULT_ERROR_CODE).errorMsg(message).build()); +// } + + public DiscourseErrorException(DiscourseError error) { + super(error.toString()); + this.error = error; + } + + public DiscourseErrorException(DiscourseError error, Throwable cause) { + super(error.toString(), cause); + this.error = error; + } + + public DiscourseErrorException(Throwable cause, DiscourseError error) { + super(cause.getMessage(), cause); +// this.error = DiscourseError.builder().errorCode(DEFAULT_ERROR_CODE).errorMsg(cause.getMessage()).build(); + this.error = error; + } + + public DiscourseError getError() { + return this.error; + } +} diff --git a/common/src/main/java/com/ossez/discourse/common/exception/DiscourseRuntimeException.java b/common/src/main/java/com/ossez/discourse/common/exception/DiscourseRuntimeException.java new file mode 100644 index 0000000..c087a04 --- /dev/null +++ b/common/src/main/java/com/ossez/discourse/common/exception/DiscourseRuntimeException.java @@ -0,0 +1,28 @@ +package com.ossez.discourse.common.exception; + +/** + * WxJava专用的runtime exception. + * + * @author Binary Wang + * created on 2020-09-26 + */ +public class DiscourseRuntimeException extends RuntimeException { + private static final long serialVersionUID = 4881698471192264412L; + + public DiscourseRuntimeException(Throwable e) { + super(e); + } + + public DiscourseRuntimeException(String msg) { + super(msg); + } + public DiscourseRuntimeException(DiscourseError discourseError) { + super(discourseError.getErrors().get(0)); + } + + + + public DiscourseRuntimeException(String msg, Throwable e) { + super(msg, e); + } +} diff --git a/common/src/main/java/com/ossez/discourse/common/exception/WxErrorException.java b/common/src/main/java/com/ossez/discourse/common/exception/WxErrorException.java deleted file mode 100644 index bbb3faf..0000000 --- a/common/src/main/java/com/ossez/discourse/common/exception/WxErrorException.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.ossez.discourse.common.exception; - -/** - * @author Daniel Qian - */ -public class WxErrorException extends Exception { - private static final long serialVersionUID = -6357149550353160810L; - - private final DiscourseError error; - - private static final int DEFAULT_ERROR_CODE = -99; - - public WxErrorException(String message) { - this(DiscourseError.builder().errorCode(DEFAULT_ERROR_CODE).errorMsg(message).build()); - } - - public WxErrorException(DiscourseError error) { - super(error.toString()); - this.error = error; - } - - public WxErrorException(DiscourseError error, Throwable cause) { - super(error.toString(), cause); - this.error = error; - } - - public WxErrorException(Throwable cause) { - super(cause.getMessage(), cause); - this.error = DiscourseError.builder().errorCode(DEFAULT_ERROR_CODE).errorMsg(cause.getMessage()).build(); - } - - public DiscourseError getError() { - return this.error; - } -} diff --git a/common/src/main/java/com/ossez/discourse/common/exception/WxRuntimeException.java b/common/src/main/java/com/ossez/discourse/common/exception/WxRuntimeException.java deleted file mode 100644 index d979bdf..0000000 --- a/common/src/main/java/com/ossez/discourse/common/exception/WxRuntimeException.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.ossez.discourse.common.exception; - -/** - * WxJava专用的runtime exception. - * - * @author Binary Wang - * created on 2020-09-26 - */ -public class WxRuntimeException extends RuntimeException { - private static final long serialVersionUID = 4881698471192264412L; - - public WxRuntimeException(Throwable e) { - super(e); - } - - public WxRuntimeException(String msg) { - super(msg); - } - - public WxRuntimeException(String msg, Throwable e) { - super(msg, e); - } -} diff --git a/common/src/main/java/com/ossez/discourse/common/model/dto/Creation.java b/common/src/main/java/com/ossez/discourse/common/model/dto/Creation.java new file mode 100644 index 0000000..e854c53 --- /dev/null +++ b/common/src/main/java/com/ossez/discourse/common/model/dto/Creation.java @@ -0,0 +1,51 @@ +package com.ossez.discourse.common.model.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.io.Serializable; +import java.util.List; + +public class Creation implements Serializable { + + private static final long serialVersionUID = 3741976827910675760L; + @JsonProperty(required = true) + private String raw; + private String createdAt; + private String embedUrl; + private String externalId; + + + public String getRaw() { + return raw; + } + + public void setRaw(String raw) { + this.raw = raw; + } + + public String getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + public String getEmbedUrl() { + return embedUrl; + } + + public void setEmbedUrl(String embedUrl) { + this.embedUrl = embedUrl; + } + + public String getExternalId() { + return externalId; + } + + public void setExternalId(String externalId) { + this.externalId = externalId; + } +} + + diff --git a/common/src/main/java/com/ossez/discourse/common/model/dto/PostCreation.java b/common/src/main/java/com/ossez/discourse/common/model/dto/PostCreation.java new file mode 100644 index 0000000..f0c590a --- /dev/null +++ b/common/src/main/java/com/ossez/discourse/common/model/dto/PostCreation.java @@ -0,0 +1,33 @@ +package com.ossez.discourse.common.model.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.io.Serializable; + +public class PostCreation extends Creation implements Serializable { + + private static final long serialVersionUID = 5896160842728180229L; + + @JsonProperty(required = true) + private Long topicId; + private Long replyToPostNumber; + + + public Long getTopicId() { + return topicId; + } + + public void setTopicId(Long topicId) { + this.topicId = topicId; + } + + public Long getReplyToPostNumber() { + return replyToPostNumber; + } + + public void setReplyToPostNumber(Long replyToPostNumber) { + this.replyToPostNumber = replyToPostNumber; + } +} + + diff --git a/common/src/main/java/com/ossez/discourse/common/model/dto/TopicCreation.java b/common/src/main/java/com/ossez/discourse/common/model/dto/TopicCreation.java new file mode 100644 index 0000000..8f156b8 --- /dev/null +++ b/common/src/main/java/com/ossez/discourse/common/model/dto/TopicCreation.java @@ -0,0 +1,32 @@ +package com.ossez.discourse.common.model.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.io.Serializable; + +public class TopicCreation extends Creation implements Serializable { + + private static final long serialVersionUID = -8992308064707164065L; + + @JsonProperty(required = true) + private String title; + private Integer category; + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Integer getCategory() { + return category; + } + + public void setCategory(Integer category) { + this.category = category; + } +} + + diff --git a/common/src/main/java/com/ossez/discourse/common/model/req/DataCubeRequest.java b/common/src/main/java/com/ossez/discourse/common/model/req/DataCubeRequest.java index 0f3d5af..d3fd125 100644 --- a/common/src/main/java/com/ossez/discourse/common/model/req/DataCubeRequest.java +++ b/common/src/main/java/com/ossez/discourse/common/model/req/DataCubeRequest.java @@ -5,6 +5,7 @@ import com.google.gson.annotations.SerializedName; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import org.jetbrains.annotations.NotNull; import java.io.Serializable; @@ -16,25 +17,23 @@ import java.io.Serializable; public class DataCubeRequest implements Serializable { private static final long serialVersionUID = -9196732086954365246L; - @JsonProperty(value = "begin_date", required = true) - private String beginDate; + @NotNull + private String title; + private Integer category; - @JsonProperty(value = "end_date", required = true) - private String endDate; - - public String getBeginDate() { - return beginDate; + public String getTitle() { + return title; } - public void setBeginDate(String beginDate) { - this.beginDate = beginDate; + public void setTitle(String title) { + this.title = title; } - public String getEndDate() { - return endDate; + public Integer getCategory() { + return category; } - public void setEndDate(String endDate) { - this.endDate = endDate; + public void setCategory(Integer category) { + this.category = category; } }