add comment, reward, total

Change-Id: Ib3d9f5f11b51e4bbf4dc5a553315ff3fd9110efb
diff --git a/src/main/java/com/g9/g9backend/controller/CommentController.java b/src/main/java/com/g9/g9backend/controller/CommentController.java
new file mode 100644
index 0000000..fec8e68
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/controller/CommentController.java
@@ -0,0 +1,94 @@
+package com.g9.g9backend.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.g9.g9backend.pojo.Comment;
+import com.g9.g9backend.pojo.DTO.GetCommentDTO;
+import com.g9.g9backend.service.CommentService;
+import org.jetbrains.annotations.NotNull;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.function.Function;
+
+@RestController
+@RequestMapping("/comment")
+public class CommentController {
+
+    private final CommentService commentService;
+
+    private final Logger logger = LoggerFactory.getLogger(CommentController.class);
+
+    public CommentController(CommentService commentService) {
+        this.commentService = commentService;
+    }
+
+    @PostMapping
+    public ResponseEntity<String> postComment(@RequestBody Comment comment) {
+        System.out.println(comment.toString());
+        commentService.save(comment);
+
+        logger.info("评论已发布");
+
+        return ResponseEntity.ok("");
+    }
+
+    @DeleteMapping
+    public ResponseEntity<String> deleteComment(@RequestParam Integer commentId) {
+        commentService.removeById(commentId);
+
+        return ResponseEntity.noContent().build();
+    }
+
+    @GetMapping
+    public ResponseEntity<GetCommentDTO> getComment(@RequestParam Integer id,
+                                                    @RequestParam Integer pageNumber,
+                                                    @RequestParam Integer rows,
+                                                    @RequestParam String type) {
+        Page<Comment> commentPage = new Page<>(pageNumber, rows);
+        LambdaQueryWrapper<Comment> rewardQuery = new LambdaQueryWrapper<Comment>()
+                .orderByDesc(Comment::getCreateAt);
+
+
+        if (Objects.equals(type, "资源")) {
+
+            rewardQuery.eq(Comment::getResourceId, id);
+        }
+
+        if (Objects.equals(type, "帖子")) {
+
+            rewardQuery.eq(Comment::getThreadId, id);
+        }
+
+        if (Objects.equals(type, "悬赏")) {
+
+            rewardQuery.eq(Comment::getRewardId, id);
+        }
+
+        Page<Comment> result = commentService.page(commentPage, rewardQuery);
+
+        GetCommentDTO getCommentDTO = wrapCommentPage(result, item -> {
+            GetCommentDTO.Comment comment = new GetCommentDTO.Comment();
+            comment.setCommentId(item.getCommentId());
+            comment.setUserId(item.getUserId());
+            comment.setReplyId(item.getReplyId() != null ? item.getReplyId() : 0);
+            comment.setContent(item.getContent());
+            comment.setCreateAt(item.getCreateAt());
+            return comment;
+        });
+
+        return ResponseEntity.ok(getCommentDTO);
+    }
+
+    @NotNull
+    private <T> GetCommentDTO wrapCommentPage(Page<T> page, Function<T, GetCommentDTO.Comment> mapper) {
+        List<GetCommentDTO.Comment> records = page.getRecords().stream().map(mapper).toList();
+
+        return new GetCommentDTO(records, (int) page.getTotal(), (int) page.getPages(), (int) page.getCurrent(), (int) page.getSize());
+    }
+
+}
diff --git a/src/main/java/com/g9/g9backend/controller/RewardController.java b/src/main/java/com/g9/g9backend/controller/RewardController.java
index c5b316b..3563f41 100644
--- a/src/main/java/com/g9/g9backend/controller/RewardController.java
+++ b/src/main/java/com/g9/g9backend/controller/RewardController.java
@@ -1,9 +1,23 @@
 package com.g9.g9backend.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.g9.g9backend.pojo.DTO.GetRewardDTO;
+import com.g9.g9backend.pojo.Reward;
+import com.g9.g9backend.service.RewardService;
+import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.function.Function;
 
 /**
  * RewardController 悬赏控制器类,处理与悬赏相关的请求
@@ -14,5 +28,103 @@
 @RequestMapping("/reward")
 public class RewardController {
 
+    private final RewardService rewardService;
+
     private final Logger logger = LoggerFactory.getLogger(RewardController.class);
+
+    public RewardController(RewardService rewardService) {
+        this.rewardService = rewardService;
+    }
+
+    @PostMapping
+    public ResponseEntity<String> postReward(@RequestBody Reward reward) {
+        reward.setCompletedBy(null);
+        reward.setResourceId(null);
+        rewardService.save(reward);
+
+        logger.info("悬赏已发布");
+
+        return ResponseEntity.ok("");
+    }
+
+    @DeleteMapping
+    public ResponseEntity<String> deleteReward(@RequestParam Integer rewardId) {
+        rewardService.removeById(rewardId);
+
+        logger.info("悬赏已删除");
+
+        return ResponseEntity.noContent().build();
+    }
+
+    @GetMapping
+    public ResponseEntity<GetRewardDTO> getReward(@RequestParam Integer pageNumber,
+                                                  @RequestParam Integer rows,
+                                                  @RequestParam String searchValue,
+                                                  @RequestParam String option) {
+        Page<Reward> rewardPage = new Page<>(pageNumber, rows);
+        LambdaQueryWrapper<Reward> rewardQuery = new LambdaQueryWrapper<Reward>()
+                .like(StringUtils.isNotBlank(searchValue), Reward::getRewardName, searchValue);
+
+        if (Objects.equals(option, "赏金最高")) {
+
+            rewardQuery.orderByDesc(Reward::getPrice);
+        } else {
+
+            rewardQuery.orderByDesc(Reward::getCreateAt);
+        }
+
+        Page<Reward> result = rewardService.page(rewardPage, rewardQuery);
+
+        GetRewardDTO getRewardDTO = wrapRewardPage(result, item -> {
+            GetRewardDTO.Reward reward = new GetRewardDTO.Reward();
+            reward.setRewardId(item.getRewardId());
+            reward.setRewardName(item.getRewardName());
+            reward.setRewardPicture(item.getRewardPicture());
+            reward.setUserId(item.getUserId());
+            reward.setPrice(item.getPrice());
+            reward.setCreateAt(item.getCreateAt());
+            return reward;
+        });
+
+        return ResponseEntity.ok(getRewardDTO);
+    }
+
+    @NotNull
+    private <T> GetRewardDTO wrapRewardPage(Page<T> page, Function<T, GetRewardDTO.Reward> mapper) {
+        List<GetRewardDTO.Reward> records = page.getRecords().stream().map(mapper).toList();
+
+        return new GetRewardDTO(records, (int) page.getTotal(), (int) page.getPages(), (int) page.getCurrent(), (int) page.getSize());
+    }
+
+    @GetMapping(value = "/info")
+    public ResponseEntity<Reward> getRewardInfo(@RequestParam Integer rewardId) {
+
+        return ResponseEntity.ok(rewardService.getById(rewardId));
+    }
+
+    @PutMapping("/info")
+    public ResponseEntity<String> putReward(@RequestBody Reward reward) {
+        Reward rewardUpdate = rewardService.getById(reward.getRewardId());
+        rewardUpdate.setRewardName(reward.getRewardName());
+        rewardUpdate.setRewardPicture(reward.getRewardPicture());
+        rewardUpdate.setPrice(reward.getPrice());
+        rewardUpdate.setRewardDescription(reward.getRewardDescription());
+        rewardUpdate.setLastUpdateAt(Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant()));
+        rewardService.updateById(rewardUpdate);
+
+        return ResponseEntity.ok("");
+    }
+
+    @PostMapping(value = "/completion")
+    public ResponseEntity<String> putRewardCompletion(@RequestBody Reward reward) {
+        Reward rewardUpdate = rewardService.getById(reward.getRewardId());
+        rewardUpdate.setCompletedBy(reward.getCompletedBy());
+        rewardUpdate.setCompletedAt(reward.getCompletedAt());
+        rewardUpdate.setResourceId(reward.getResourceId());
+        rewardService.updateById(rewardUpdate);
+
+        return ResponseEntity.ok("");
+    }
+
+
 }
diff --git a/src/main/java/com/g9/g9backend/controller/TotalController.java b/src/main/java/com/g9/g9backend/controller/TotalController.java
new file mode 100644
index 0000000..2359586
--- /dev/null
+++ b/src/main/java/com/g9/g9backend/controller/TotalController.java
@@ -0,0 +1,67 @@
+package com.g9.g9backend.controller;
+
+import com.g9.g9backend.service.ResourceService;
+import com.g9.g9backend.service.ThreadService;
+import com.g9.g9backend.service.UserPurchaseService;
+import com.g9.g9backend.service.UserUploadService;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/total")
+public class TotalController {
+
+    private final ThreadService threadService;
+
+    private final UserPurchaseService userPurchaseService;
+
+    private final UserUploadService userUploadService;
+
+    private final ResourceService resourceService;
+
+    public TotalController(ThreadService threadService, UserPurchaseService userPurchaseService, UserUploadService userUploadService, ResourceService resourceService) {
+        this.threadService = threadService;
+        this.userPurchaseService = userPurchaseService;
+        this.userUploadService = userUploadService;
+        this.resourceService = resourceService;
+    }
+
+    private final Logger logger = LoggerFactory.getLogger(TotalController.class);
+
+
+    @GetMapping(value = "/info")
+    public ResponseEntity<Info> getTotalInfo() {
+
+        long threadCount = threadService.count();
+        long downloadCount = userPurchaseService.count();
+        long authorCount = userUploadService.count();
+        long resourceCount = resourceService.count();
+
+        Info info = new Info(threadCount, downloadCount, authorCount, resourceCount);
+        logger.info("统计数据返回:{}", info);
+
+        return ResponseEntity.ok(info);
+    }
+
+    @Data
+    @AllArgsConstructor
+    @NoArgsConstructor
+    public static class Info {
+
+        private long threadCount;
+
+        private long downloadCount;
+
+        private long authorCount;
+
+        private long resourceCount;
+
+    }
+}