ZCH-19 更新错误处理代码,并且对创建的 API 进行调整
This commit is contained in:
parent
c7b11d27fe
commit
223d951d62
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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<Topic> createTopic(TopicCreation topicCreation) {
|
||||
String path = "/posts.json";
|
||||
|
||||
Optional<Topic> topic = Optional.ofNullable(new Topic());
|
||||
Optional<Post> 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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
|
||||
|
|
|
@ -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 {
|
|||
});
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -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> 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> 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());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
// }
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
/**
|
||||
* 微信错误码.
|
||||
* 请阅读:
|
||||
* 公众平台:<a href="https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Global_Return_Code.html">全局返回码说明</a>
|
||||
* 企业微信:<a href="https://work.weixin.qq.com/api/doc#10649">全局错误码</a>
|
||||
*
|
||||
* @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<String> 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<String> 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<String> getErrors() {
|
||||
return errors;
|
||||
}
|
||||
|
||||
public void setErrors(List<String> errors) {
|
||||
this.errors = errors;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
package com.ossez.discourse.common.exception;
|
||||
|
||||
/**
|
||||
* WxJava专用的runtime exception.
|
||||
*
|
||||
* @author <a href="https://github.com/binarywang">Binary Wang</a>
|
||||
* 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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
package com.ossez.discourse.common.exception;
|
||||
|
||||
/**
|
||||
* WxJava专用的runtime exception.
|
||||
*
|
||||
* @author <a href="https://github.com/binarywang">Binary Wang</a>
|
||||
* 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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue