Просмотр исходного кода

feat:1.增加关于Post的接口

shanshan 2 лет назад
Родитель
Сommit
cfdefab976

+ 31 - 0
src/main/java/cn/seecoder/fdroidrepository/Controller/PostController.java

@@ -0,0 +1,31 @@
+package cn.seecoder.fdroidrepository.Controller;
+
+import cn.seecoder.fdroidrepository.DataObject.VO.PostVO;
+import cn.seecoder.fdroidrepository.DataObject.VO.Response;
+import cn.seecoder.fdroidrepository.Service.PostService;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/post")
+@RequiredArgsConstructor
+public class PostController {
+    private final PostService postService;
+
+    @PostMapping("/create")
+    public Response createPost(@RequestBody PostVO postVO) {
+        return postService.createPost(postVO);
+    }
+
+    @PostMapping("/update")
+    public Response updatePost(@RequestBody PostVO postVO) {
+        return postService.updatePost(postVO);
+    }
+
+    @GetMapping("/listByUser")
+    public Response listByUser(@Param("userId") Integer userId) {
+        return postService.selectAllPostByUser(userId);
+    }
+}

+ 12 - 0
src/main/java/cn/seecoder/fdroidrepository/DataObject/Enum/PostTypeEnum.java

@@ -0,0 +1,12 @@
+package cn.seecoder.fdroidrepository.DataObject.Enum;
+
+public enum PostTypeEnum {
+    ARTICLE(1),
+    QUESTION(2),
+    ANSWER(3),
+    COMMENT(4);
+    private Integer value;
+    PostTypeEnum(Integer value) {
+        this.value = value;
+    }
+}

+ 5 - 1
src/main/java/cn/seecoder/fdroidrepository/DataObject/Enum/ResultCode.java

@@ -8,7 +8,11 @@ public enum ResultCode {
     // App 相关的错误代码
     APPINFO_NON_EXIST(20001, "对应的AppInfo不存在"),
     GRADLE_REWRITE_FAIL(20002, "Gradle文件重写错误"),
-    BUILD_TASK_NON_EXIST(20003, "对应的BuildTask不存在");
+    BUILD_TASK_NON_EXIST(20003, "对应的BuildTask不存在"),
+    // Bug 相关的错误代码
+
+    // Post 相关的错误代码
+    POST_NON_EXIST(40001, "对应的POST不存在或被删除");
     private Integer code;
     private String message;
     ResultCode(Integer code, String message) {

+ 0 - 1
src/main/java/cn/seecoder/fdroidrepository/DataObject/PO/AppInfoPO.java

@@ -7,7 +7,6 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.util.Date;
-import java.util.List;
 
 @Data
 @Builder

+ 21 - 0
src/main/java/cn/seecoder/fdroidrepository/DataObject/PO/PostLogPO.java

@@ -0,0 +1,21 @@
+package cn.seecoder.fdroidrepository.DataObject.PO;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * PostLogPO 记录了特定Post的更改历史,例如Article/Question/Answer;
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PostLogPO {
+    private Integer id;
+    private Integer postId;
+    private String title;
+    private String content;
+    private Date updateTime;
+}

+ 42 - 0
src/main/java/cn/seecoder/fdroidrepository/DataObject/PO/PostPO.java

@@ -0,0 +1,42 @@
+package cn.seecoder.fdroidrepository.DataObject.PO;
+
+import cn.seecoder.fdroidrepository.DataObject.Enum.PostTypeEnum;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * PostPO 是Article/Question/Answer/Comment 四种类型的统称
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PostPO {
+    private Integer id;
+    private Integer authorId;
+    private String authorName;
+    private String title;
+    private String content;
+
+    private Date createTime;
+    private Date updateTime;
+
+    private Boolean valid; // 表示某个Post是否有效/可见
+
+    private PostTypeEnum type;
+
+    // Article 特有属性
+    private Integer topicId;
+    private String topicName;
+
+    // Question 特有属性
+
+    // Answer 特有属性
+    private Integer questionId;
+    private String questionName;
+
+    // Comment 特有属性
+    private Integer replyToId;
+}

+ 6 - 0
src/main/java/cn/seecoder/fdroidrepository/DataObject/VO/BugVO.java

@@ -1,8 +1,10 @@
 package cn.seecoder.fdroidrepository.DataObject.VO;
 
+import cn.seecoder.fdroidrepository.DataObject.PO.BugPO;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.springframework.beans.BeanUtils;
 
 import java.util.Date;
 
@@ -19,4 +21,8 @@ public class BugVO {
     private Date updateTime;
     private String description; // 对该Bug的描述,是一个HTML文本,前端可以直接进行展示
     private Boolean fixed;
+
+    public BugVO(BugPO bugPO) {
+        BeanUtils.copyProperties(bugPO, this);
+    }
 }

+ 24 - 0
src/main/java/cn/seecoder/fdroidrepository/DataObject/VO/PostLogVO.java

@@ -0,0 +1,24 @@
+package cn.seecoder.fdroidrepository.DataObject.VO;
+
+import cn.seecoder.fdroidrepository.DataObject.PO.PostLogPO;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.beans.BeanUtils;
+
+import java.util.Date;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PostLogVO {
+    private Integer id;
+    private Integer postId;
+    private String title;
+    private String content;
+    private Date updateTime;
+
+    public PostLogVO(PostLogPO postLogPO) {
+        BeanUtils.copyProperties(postLogPO, this);
+    }
+}

+ 45 - 0
src/main/java/cn/seecoder/fdroidrepository/DataObject/VO/PostVO.java

@@ -0,0 +1,45 @@
+package cn.seecoder.fdroidrepository.DataObject.VO;
+
+import cn.seecoder.fdroidrepository.DataObject.Enum.PostTypeEnum;
+import cn.seecoder.fdroidrepository.DataObject.PO.PostPO;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.beans.BeanUtils;
+
+import java.util.Date;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PostVO {
+    private Integer id;
+    private Integer authorId;
+    private String authorName;
+    private String title;
+    private String content;
+
+    private Date createTime;
+    private Date updateTime;
+
+    private Boolean valid; // 表示某个Post是否有效/可见
+
+    private PostTypeEnum type;
+
+    // Article 特有属性
+    private Integer topicId;
+    private String topicName;
+
+    // Question 特有属性
+
+    // Answer 特有属性
+    private Integer questionId;
+    private String questionName;
+
+    // Comment 特有属性
+    private Integer replyToId;
+
+    public PostVO(PostPO postPO) {
+        BeanUtils.copyProperties(postPO, this);
+    }
+}

+ 4 - 1
src/main/java/cn/seecoder/fdroidrepository/Mapper/BugMapper.java

@@ -13,6 +13,9 @@ public interface BugMapper {
     @InsertProvider(type = GeneralInsertUpdateSqlProvider.class, method = "insert")
     Integer insert(@Param("obj") BugPO bugPO);
 
-    @Select("select * from bug where app_id = #{appId}")
+    @Select("select * from bug where app_id = #{appId} and fixed = false")
     List<BugPO> selectByAppId(Integer appId);
+
+    @Select("select * from bug where app_id = #{appId} and fixed = true")
+    List<BugPO> selectFixedByAppId(Integer appId);
 }

+ 18 - 0
src/main/java/cn/seecoder/fdroidrepository/Mapper/PostLogMapper.java

@@ -0,0 +1,18 @@
+package cn.seecoder.fdroidrepository.Mapper;
+
+import cn.seecoder.fdroidrepository.DataObject.PO.PostLogPO;
+import org.apache.ibatis.annotations.InsertProvider;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface PostLogMapper {
+    @InsertProvider(type = GeneralInsertUpdateSqlProvider.class, method = "insert")
+    Integer insert(@Param("obj")PostLogPO postLogPO);
+
+    @Select("select * from post_log where post_id = #{postId} order by update_time")
+    List<PostLogPO> selectAll(Integer postId);
+}

+ 34 - 0
src/main/java/cn/seecoder/fdroidrepository/Mapper/PostMapper.java

@@ -0,0 +1,34 @@
+package cn.seecoder.fdroidrepository.Mapper;
+
+import cn.seecoder.fdroidrepository.DataObject.PO.PostPO;
+import org.apache.ibatis.annotations.*;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface PostMapper {
+    @InsertProvider(type = GeneralInsertUpdateSqlProvider.class, method = "insert")
+    Integer insert(@Param("obj")PostPO postPO);
+
+    @UpdateProvider(type = GeneralInsertUpdateSqlProvider.class, method = "updateById")
+    Integer update(@Param("obj")PostPO postPO);
+
+    @Update("update post set valid = false where id = #{postId}")
+    Integer deletePost(Integer postId);
+
+    @Select("select * from post where id = #{postId}")
+    PostPO selectById(Integer postId);
+
+    @Select("select * from post where author_id = #{authorId} and valid = true")
+    List<PostPO> selectByAuthorId(Integer authorId);
+
+    @Select("select * from post where type = 1 and topic_id = #{topicId} and valid = true")
+    List<PostPO> selectArticlesByTopicId(Integer topicId);
+
+    @Select("select * from post where type = 3 and question_id = #{questionId} and valid = true")
+    List<PostPO> selectAnswersByQuestionId(Integer questionId);
+
+    @Select("select * from post where type = 4 and reply_to_id = #{replyToId} and valid = true")
+    List<PostPO> selectComments(Integer replyToId);
+}

+ 12 - 0
src/main/java/cn/seecoder/fdroidrepository/Service/PostService.java

@@ -0,0 +1,12 @@
+package cn.seecoder.fdroidrepository.Service;
+
+import cn.seecoder.fdroidrepository.DataObject.VO.PostVO;
+import cn.seecoder.fdroidrepository.DataObject.VO.Response;
+
+public interface PostService {
+    Response createPost(PostVO postVO);
+
+    Response updatePost(PostVO postVO);
+
+    Response selectAllPostByUser(Integer userId);
+}

+ 1 - 1
src/main/java/cn/seecoder/fdroidrepository/Service/ServiceImpl/BugServiceImpl.java

@@ -38,7 +38,7 @@ public class BugServiceImpl implements BugService {
             return Response.buildFailure(ResultCode.ILLEGAL_ARGUMENT.getCode(), ResultCode.ILLEGAL_ARGUMENT.getMessage());
         }
         List<BugPO> bugList = bugMapper.selectByAppId(appId);
-        Map<String, List<BugPO>> bugMap = bugList.stream().collect(Collectors.groupingBy(BugPO::getVersion));
+        Map<String, List<BugVO>> bugMap = bugList.stream().map(BugVO::new).collect(Collectors.groupingBy(BugVO::getVersion));
         return Response.buildSuccess(bugMap);
     }
 }

+ 73 - 0
src/main/java/cn/seecoder/fdroidrepository/Service/ServiceImpl/PostServiceImpl.java

@@ -0,0 +1,73 @@
+package cn.seecoder.fdroidrepository.Service.ServiceImpl;
+
+import cn.seecoder.fdroidrepository.DataObject.Enum.PostTypeEnum;
+import cn.seecoder.fdroidrepository.DataObject.Enum.ResultCode;
+import cn.seecoder.fdroidrepository.DataObject.PO.PostLogPO;
+import cn.seecoder.fdroidrepository.DataObject.PO.PostPO;
+import cn.seecoder.fdroidrepository.DataObject.VO.PostVO;
+import cn.seecoder.fdroidrepository.DataObject.VO.Response;
+import cn.seecoder.fdroidrepository.Mapper.PostLogMapper;
+import cn.seecoder.fdroidrepository.Mapper.PostMapper;
+import cn.seecoder.fdroidrepository.Service.PostService;
+import javafx.geometry.Pos;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.security.core.parameters.P;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Service
+@RequiredArgsConstructor
+public class PostServiceImpl implements PostService {
+    private final PostMapper postMapper;
+    private final PostLogMapper postLogMapper;
+
+    @Override
+    public Response createPost(PostVO postVO) {
+        PostPO postPO = new PostPO();
+        BeanUtils.copyProperties(postVO, postPO);
+        postPO.setUpdateTime(new Date(System.currentTimeMillis()));
+        Integer postId = postMapper.insert(postPO);
+        return Response.buildSuccess(postId);
+    }
+
+    @Override
+    public Response updatePost(PostVO postVO) {
+        if (postVO.getId() == null) {
+            return Response.buildFailure(ResultCode.ILLEGAL_ARGUMENT.getCode(), ResultCode.ILLEGAL_ARGUMENT.getMessage());
+        }
+        PostPO oldPost = postMapper.selectById(postVO.getId());
+        if (oldPost == null || !oldPost.getValid()) {
+            return Response.buildFailure(ResultCode.POST_NON_EXIST.getCode(), ResultCode.POST_NON_EXIST.getMessage());
+        }
+        PostPO newPost = new PostPO();
+        BeanUtils.copyProperties(postVO, newPost);
+        newPost.setUpdateTime(new Date(System.currentTimeMillis()));
+        postMapper.update(newPost);
+        // 在PostLog中增加新的历史记录
+        if (PostTypeEnum.ARTICLE.equals(postVO.getType()) || PostTypeEnum.QUESTION.equals(postVO.getType())
+                || PostTypeEnum.ANSWER.equals(postVO.getType())) {
+            PostLogPO postLogPO = new PostLogPO();
+            postLogPO.setPostId(postVO.getId());
+            postLogPO.setTitle(oldPost.getTitle());
+            postLogPO.setContent(oldPost.getTitle());
+            postLogPO.setUpdateTime(new Date(System.currentTimeMillis()));
+            postLogMapper.insert(postLogPO);
+        }
+        return Response.buildSuccess(postVO.getId());
+    }
+
+    @Override
+    public Response selectAllPostByUser(Integer userId) {
+        if (userId == null) {
+            return Response.buildFailure(ResultCode.ILLEGAL_ARGUMENT.getCode(), ResultCode.ILLEGAL_ARGUMENT.getMessage());
+        }
+        List<PostPO> postPOList = postMapper.selectByAuthorId(userId);
+        Map<PostTypeEnum, List<PostVO>> result = postPOList.stream().map(PostVO::new).collect(Collectors.groupingBy(PostVO::getType));
+        return Response.buildSuccess(result);
+    }
+}

+ 5 - 1
src/main/java/cn/seecoder/fdroidrepository/security/WebSecurityConfiguration.java

@@ -44,7 +44,11 @@ public class WebSecurityConfiguration {
                 .antMatchers(GET, "/app/checkStatus").authenticated()
                 // BugController
                 .antMatchers(POST, "/bug/create").authenticated()
-                .antMatchers(GET, "/app/listBugs").access("@authTools.checkAppContributorParam(request)")
+                .antMatchers(GET, "/bug/listBugs").access("@authTools.checkAppContributorParam(request)")
+                // PostController
+                .antMatchers(POST, "/post/create").authenticated()
+                .antMatchers(POST, "/post/update").authenticated()
+                .antMatchers(GET, "/post/listByUser").authenticated()
                 .requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
                 // 拒绝其他请求
                 .anyRequest().denyAll();