From 259050ba8d7413d1f8dde0b0c1605900be2d85e0 Mon Sep 17 00:00:00 2001 From: YuCheng Hu Date: Wed, 4 Oct 2023 12:28:31 -0400 Subject: [PATCH] =?UTF-8?q?ZCH-20=20=E6=9B=B4=E6=96=B0=20Post=20=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../discourse/client/DiscourseClient.java | 13 +++++- .../client/service/PostsService.java | 36 ++++++++++++++++ .../service/WeChatOfficialAccountApi.java | 4 +- .../client/test/PostsServiceTest.java | 20 ++++++++- .../ossez/discourse/client/test/TestBase.java | 1 + common/pom.xml | 11 +++-- .../common/model/dto/PostUpdate.java | 43 +++++++++++++++++++ .../common/model/req/QueryQuota.java | 22 ---------- pom.xml | 4 +- 9 files changed, 123 insertions(+), 31 deletions(-) create mode 100644 common/src/main/java/com/ossez/discourse/common/model/dto/PostUpdate.java delete mode 100644 common/src/main/java/com/ossez/discourse/common/model/req/QueryQuota.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 f3fb1f0..a290eaf 100644 --- a/client/src/main/java/com/ossez/discourse/client/DiscourseClient.java +++ b/client/src/main/java/com/ossez/discourse/client/DiscourseClient.java @@ -13,7 +13,8 @@ public abstract class DiscourseClient { public static String site_url = "https://www.zchub.net/";// base url. e.g. http://your_discourse_domain.com public static String api_key = ""; public static String api_username = ""; - public ObjectMapper objectMapper = new ObjectMapper(); + public ObjectMapper objectMapper = new ObjectMapper(); + public Request getRequest(String path) { HttpUrl.Builder urlBuilder = HttpUrl.parse(site_url + path).newBuilder(); Request request = new Request.Builder().url(urlBuilder.build().toString()) @@ -34,4 +35,14 @@ public abstract class DiscourseClient { return request; } + public Request putRequest(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) + .put(body) + .build(); + return request; + } + } diff --git a/client/src/main/java/com/ossez/discourse/client/service/PostsService.java b/client/src/main/java/com/ossez/discourse/client/service/PostsService.java index 8eb6044..ba40bcd 100644 --- a/client/src/main/java/com/ossez/discourse/client/service/PostsService.java +++ b/client/src/main/java/com/ossez/discourse/client/service/PostsService.java @@ -1,11 +1,17 @@ package com.ossez.discourse.client.service; import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.ossez.discourse.client.DiscourseClient; import com.ossez.discourse.common.model.dto.Post; +import com.ossez.discourse.common.model.dto.PostUpdate; +import okhttp3.MediaType; import okhttp3.OkHttpClient; +import okhttp3.RequestBody; import okhttp3.Response; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.math.NumberUtils; import org.apache.http.HttpStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -55,4 +61,34 @@ public class PostsService extends DiscourseClient { } return post; } + + public Optional updatePost(PostUpdate postUpdate) { + if (ObjectUtils.isEmpty(postUpdate.getId())) + throw new RuntimeException("Post Id is empty, not able to update a post."); + + String path = "posts/" + String.valueOf(postUpdate.getId()) + ".json"; + + Optional post = Optional.ofNullable(new Post()); + try { + RequestBody body = RequestBody.create( + MediaType.parse("application/json"), objectMapper.writeValueAsString(postUpdate)); + Response response = client.newCall(putRequest(path, body)).execute(); + String responseStr = response.body().string(); + JsonNode jsonNode = objectMapper.readTree(responseStr); + + if (response.code() == HttpStatus.SC_OK) { + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); + + if (ObjectUtils.isNotEmpty(jsonNode.get("post"))) { + post = Optional.of(objectMapper.treeToValue(jsonNode.get("post"), Post.class)); + } + } + } catch (IOException e) { + throw new RuntimeException(e); + } + return post; + } + + } diff --git a/client/src/main/java/com/ossez/discourse/client/service/WeChatOfficialAccountApi.java b/client/src/main/java/com/ossez/discourse/client/service/WeChatOfficialAccountApi.java index ffc149c..d0e0a39 100644 --- a/client/src/main/java/com/ossez/discourse/client/service/WeChatOfficialAccountApi.java +++ b/client/src/main/java/com/ossez/discourse/client/service/WeChatOfficialAccountApi.java @@ -5,7 +5,7 @@ import com.ossez.discourse.common.model.WeChatStatus; import com.ossez.discourse.common.model.req.CustomMessage; import com.ossez.discourse.common.model.req.DataCubeRequest; import com.ossez.discourse.common.model.req.NetworkCheck; -import com.ossez.discourse.common.model.req.QueryQuota; +import com.ossez.discourse.common.model.dto.PostUpdate; import com.ossez.discourse.common.model.res.DataCubeArticle; import com.ossez.discourse.common.model.res.DataCubeUser; import com.ossez.discourse.common.model.res.NetworkCheckResponse; @@ -27,7 +27,7 @@ public interface WeChatOfficialAccountApi { Single clearQuota(@Body NetworkCheck request); @POST("/cgi-bin/openapi/quota/get") - Single queryQuota(@Body QueryQuota request); + Single queryQuota(@Body PostUpdate request); @POST("/cgi-bin/message/custom/send") Single sendMessage(@Body CustomMessage customMessage); 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 38549b6..0abdead 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 @@ -1,14 +1,19 @@ package com.ossez.discourse.client.test; +import org.apache.commons.io.StandardLineSeparator; import com.google.inject.Inject; import com.ossez.discourse.client.service.PostsService; import com.ossez.discourse.common.exception.DiscourseErrorException; +import com.ossez.discourse.common.model.dto.PostUpdate; +import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.UUID; + /** * Test for datacube API * @@ -26,11 +31,24 @@ public class PostsServiceTest extends TestBase { * @throws DiscourseErrorException */ @Test - public void testCreate() throws DiscourseErrorException { + public void testCreatePost() throws DiscourseErrorException { log.debug("Create WeChat Offical Account Menun Test"); log.debug("{}", postsService.getPost(Long.valueOf("1245")).get().getRaw()); } + @Test + public void testUpdatePost() throws DiscourseErrorException { + log.debug("Discourse Update Post Test"); + PostUpdate postUpdate = new PostUpdate(); + postUpdate.setId(DISCOURSE_POST_ID); + + StringBuilder rawBuilder = new StringBuilder().append(DISCOURSE_TOPIC_CONTENT); + rawBuilder.append(StandardLineSeparator.CRLF.getString()); + rawBuilder.append(UUID.randomUUID().toString()); + postUpdate.setRaw(rawBuilder.toString()); + + log.debug("{}", postsService.updatePost(postUpdate).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 a94f830..98d39dd 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 @@ -26,6 +26,7 @@ public class TestBase { 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_CONTENT = "ZCHub Discourse API Test"; public static final String DISCOURSE_TOPIC_TITLE_CREATE = "ZCHub Discourse API Test - CREATE"; @BeforeAll diff --git a/common/pom.xml b/common/pom.xml index ac7ceee..11c2d90 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -77,18 +77,21 @@ com.google.code.gson gson + + - commons-codec - commons-codec + org.apache.commons + commons-lang3 commons-io commons-io - org.apache.commons - commons-lang3 + commons-codec + commons-codec + com.google.guava guava diff --git a/common/src/main/java/com/ossez/discourse/common/model/dto/PostUpdate.java b/common/src/main/java/com/ossez/discourse/common/model/dto/PostUpdate.java new file mode 100644 index 0000000..3a5a785 --- /dev/null +++ b/common/src/main/java/com/ossez/discourse/common/model/dto/PostUpdate.java @@ -0,0 +1,43 @@ +package com.ossez.discourse.common.model.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.io.Serializable; + +/** + * PostUpdate Data Object + * + * @author YuCheng Hu + */ +public class PostUpdate implements Serializable { + + private static final long serialVersionUID = -227183546475863573L; + + private Long id; + private String raw; + private String editReason; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getRaw() { + return raw; + } + + public void setRaw(String raw) { + this.raw = raw; + } + + public String getEditReason() { + return editReason; + } + + public void setEditReason(String editReason) { + this.editReason = editReason; + } +} diff --git a/common/src/main/java/com/ossez/discourse/common/model/req/QueryQuota.java b/common/src/main/java/com/ossez/discourse/common/model/req/QueryQuota.java deleted file mode 100644 index b06fb1b..0000000 --- a/common/src/main/java/com/ossez/discourse/common/model/req/QueryQuota.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.ossez.discourse.common.model.req; - -import com.fasterxml.jackson.annotation.JsonProperty; -import org.apache.commons.lang3.StringUtils; - -/** - * WeChatAccessToken Response Object - * - * @author YuCheng Hu - */ -public class QueryQuota { - @JsonProperty("cgi_path") - private String cgiPath = "/cgi-bin/message/custom/send"; - - public String getCgiPath() { - return cgiPath; - } - - public void setCgiPath(String cgiPath) { - this.cgiPath = cgiPath; - } -} diff --git a/pom.xml b/pom.xml index f7b3509..5017fab 100644 --- a/pom.xml +++ b/pom.xml @@ -96,6 +96,8 @@ httpmime ${httpclient.version} + + commons-codec commons-codec @@ -104,7 +106,7 @@ commons-io commons-io - 2.7 + 2.14.0 org.apache.commons