From 06e5c18cc78beb30d495897be917ae59109eeba0 Mon Sep 17 00:00:00 2001 From: johnniang Date: Mon, 4 Mar 2019 22:53:27 +0800 Subject: [PATCH] Enhance ApiJournalController --- .../ryanc/halo/model/params/JournalParam.java | 6 +++- .../java/cc/ryanc/halo/utils/HaloUtils.java | 4 +++ .../web/controller/admin/AdminController.java | 1 + .../controller/api/ApiJournalController.java | 34 +++++++++---------- .../base/ControllerExceptionHandler.java | 19 +++++++++++ .../cc/ryanc/halo/utils/BeanUtilsTest.java | 16 +++++++++ 6 files changed, 61 insertions(+), 19 deletions(-) diff --git a/src/main/java/cc/ryanc/halo/model/params/JournalParam.java b/src/main/java/cc/ryanc/halo/model/params/JournalParam.java index 970f5cbbc..6c0d13ca1 100644 --- a/src/main/java/cc/ryanc/halo/model/params/JournalParam.java +++ b/src/main/java/cc/ryanc/halo/model/params/JournalParam.java @@ -2,6 +2,7 @@ package cc.ryanc.halo.model.params; import cc.ryanc.halo.model.domain.Post; import cc.ryanc.halo.model.dto.base.AbstractInputConverter; +import cc.ryanc.halo.model.enums.PostTypeEnum; import cc.ryanc.halo.utils.MarkdownUtils; import lombok.Data; @@ -31,9 +32,12 @@ public class JournalParam extends AbstractInputConverter { @Override public Post convertTo() { - Post post = super.convertTo(); + Post post = new Post(); + post.setPostTitle(title); post.setPostContentMd(content); post.setPostContent(MarkdownUtils.renderMarkdown(content)); + post.setPostSource(source); + post.setPostType(PostTypeEnum.POST_TYPE_JOURNAL.getDesc()); return post; } } diff --git a/src/main/java/cc/ryanc/halo/utils/HaloUtils.java b/src/main/java/cc/ryanc/halo/utils/HaloUtils.java index e7d9f8ee8..262e16367 100755 --- a/src/main/java/cc/ryanc/halo/utils/HaloUtils.java +++ b/src/main/java/cc/ryanc/halo/utils/HaloUtils.java @@ -295,6 +295,10 @@ public class HaloUtils { * @param password password */ public static void configMail(String smtpHost, String userName, String password) { + Assert.hasText(smtpHost, "SMTP host config must not be blank"); + Assert.hasText(userName, "Email username must not be blank"); + Assert.hasText(password, "Email password must not be blank"); + final Properties properties = OhMyEmail.defaultConfig(false); properties.setProperty("mail.smtp.host", smtpHost); OhMyEmail.config(properties, userName, password); diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/AdminController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/AdminController.java index 10e792235..25678e69d 100755 --- a/src/main/java/cc/ryanc/halo/web/controller/admin/AdminController.java +++ b/src/main/java/cc/ryanc/halo/web/controller/admin/AdminController.java @@ -240,6 +240,7 @@ public class AdminController extends BaseController { session.setAttribute(RESET_PASSWORD_SESSION_KEY, code); return JsonResult.success("邮件发送成功,请登录您的邮箱进行下一步操作"); } catch (Exception e) { + log.error("Failed to send password email", e); return JsonResult.fail("邮件发送失败,请确定已经配置好了发信服务器信息"); } } diff --git a/src/main/java/cc/ryanc/halo/web/controller/api/ApiJournalController.java b/src/main/java/cc/ryanc/halo/web/controller/api/ApiJournalController.java index ad7ead079..7b7b37aa4 100644 --- a/src/main/java/cc/ryanc/halo/web/controller/api/ApiJournalController.java +++ b/src/main/java/cc/ryanc/halo/web/controller/api/ApiJournalController.java @@ -1,15 +1,10 @@ package cc.ryanc.halo.web.controller.api; import cc.ryanc.halo.model.domain.Post; -import cc.ryanc.halo.model.enums.PostTypeEnum; import cc.ryanc.halo.model.params.JournalParam; -import cc.ryanc.halo.model.support.JsonResult; import cc.ryanc.halo.service.PostService; -import cc.ryanc.halo.utils.MarkdownUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; /** *
@@ -20,11 +15,14 @@ import org.springframework.web.bind.annotation.RestController;
  * @date : 2019/03/04
  */
 @RestController
-@RequestMapping(value = "/api/journal")
+@RequestMapping(value = "/api/journals")
 public class ApiJournalController {
 
-    @Autowired
-    private PostService postService;
+    private final PostService postService;
+
+    public ApiJournalController(PostService postService) {
+        this.postService = postService;
+    }
 
     /**
      * 发布日志
@@ -32,13 +30,13 @@ public class ApiJournalController {
      * @param journalParam journalParam
      * @return JsonResult
      */
-    @PostMapping(value = "/save")
-    public JsonResult save(JournalParam journalParam) {
-        Post post = new Post();
-        post.setPostContentMd(MarkdownUtils.renderMarkdown(journalParam.getContent()));
-        post.setPostSource(journalParam.getSource());
-        post.setPostType(PostTypeEnum.POST_TYPE_JOURNAL.getDesc());
-        post = postService.create(post);
-        return JsonResult.success("ok");
+    @PostMapping
+    @ResponseStatus(HttpStatus.CREATED)
+    public Post save(@RequestBody JournalParam journalParam) {
+        // TODO need to validate token
+
+        Post post = journalParam.convertTo();
+
+        return postService.create(post);
     }
 }
diff --git a/src/main/java/cc/ryanc/halo/web/controller/base/ControllerExceptionHandler.java b/src/main/java/cc/ryanc/halo/web/controller/base/ControllerExceptionHandler.java
index 7ba4eecad..abd5a643b 100644
--- a/src/main/java/cc/ryanc/halo/web/controller/base/ControllerExceptionHandler.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/base/ControllerExceptionHandler.java
@@ -8,7 +8,9 @@ import cc.ryanc.halo.utils.ValidationUtils;
 import org.springframework.dao.DataIntegrityViolationException;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
+import org.springframework.http.converter.HttpMessageNotReadableException;
 import org.springframework.util.Assert;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
 import org.springframework.web.bind.MethodArgumentNotValidException;
 import org.springframework.web.bind.MissingServletRequestParameterException;
 import org.springframework.web.bind.annotation.ExceptionHandler;
@@ -69,6 +71,23 @@ public class ControllerExceptionHandler {
         return jsonResult;
     }
 
+    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    public JsonResult handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) {
+        JsonResult jsonResult = handleBaseException(e);
+        jsonResult.setCode(HttpStatus.BAD_REQUEST.value());
+        return jsonResult;
+    }
+
+    @ExceptionHandler(HttpMessageNotReadableException.class)
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    public JsonResult handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
+        JsonResult jsonResult = handleBaseException(e);
+        jsonResult.setCode(HttpStatus.BAD_REQUEST.value());
+        jsonResult.setMsg("Required request body is missing");
+        return jsonResult;
+    }
+
     @ExceptionHandler(NoHandlerFoundException.class)
     @ResponseStatus(HttpStatus.BAD_GATEWAY)
     public JsonResult handleNoHandlerFoundException(NoHandlerFoundException e) {
diff --git a/src/test/java/cc/ryanc/halo/utils/BeanUtilsTest.java b/src/test/java/cc/ryanc/halo/utils/BeanUtilsTest.java
index 0d4c389d5..8ce6aa9c5 100644
--- a/src/test/java/cc/ryanc/halo/utils/BeanUtilsTest.java
+++ b/src/test/java/cc/ryanc/halo/utils/BeanUtilsTest.java
@@ -30,6 +30,9 @@ public class BeanUtilsTest {
         assertEquals(a.getB(), b.getB());
         assertNull(b.getC());
 
+        TestD d = new TestD(a);
+        TestE e = BeanUtils.transformFrom(d, TestE.class);
+        assertEquals(d.getA().getA(), e.getA().getA());
     }
 
     @Test
@@ -95,4 +98,17 @@ public class BeanUtilsTest {
         private Integer b;
     }
 
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    static class TestD {
+        private TestA a;
+    }
+
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    static class TestE {
+        private TestA a;
+    }
 }
\ No newline at end of file