post_rating

Change-Id: Ia1a6fb3f87b793a6307046e36951c1fb36b213c8
diff --git a/src/main/java/com/example/g8backend/controller/PostController.java b/src/main/java/com/example/g8backend/controller/PostController.java
index 9ac733f..e5e4eab 100644
--- a/src/main/java/com/example/g8backend/controller/PostController.java
+++ b/src/main/java/com/example/g8backend/controller/PostController.java
@@ -8,17 +8,20 @@
 import com.example.g8backend.entity.Post;
 import com.example.g8backend.entity.PostView;
 import com.example.g8backend.mapper.PostViewMapper;
+import com.example.g8backend.service.IPostRatingService;
 import com.example.g8backend.service.IPostService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
 @RestController
 @RequestMapping("/post")
+@Validated
 public class PostController {
 
     @Autowired
@@ -149,4 +152,43 @@
         Page<Post> result = postService.getRecommendedByTags(page, size, userId);
         return ResponseEntity.ok(ApiResponse.success(result));
     }
+    @Autowired
+    private IPostRatingService postRatingService;
+
+    @PostMapping("/{postId}/rate")
+    public ResponseEntity<ApiResponse<String>> ratePost(
+            @PathVariable Long postId,
+            @RequestParam Integer rating) {
+        try {
+            long userId = (long) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+
+            // 调用服务层方法(服务层已内置校验逻辑)
+            postRatingService.ratePost(userId, postId, rating);
+
+            // 成功时返回空数据
+            return ResponseEntity.ok(ApiResponse.success("评分成功"));
+
+        } catch (IllegalArgumentException e) {
+            // 处理参数校验异常(如评分范围错误)
+            return ResponseEntity.badRequest()
+                    .body(ApiResponse.error(400, e.getMessage()));
+
+        } catch (RuntimeException e) {
+            // 处理数据库操作失败等运行时异常
+            return ResponseEntity.internalServerError()
+                    .body(ApiResponse.error(500, e.getMessage()));
+        }
+    }
+
+    @GetMapping("/{postId}/average-rating")
+    public ResponseEntity<ApiResponse<Double>> getAverageRating(@PathVariable Long postId) {
+        Double avg = postRatingService.getAverageRating(postId);
+        return ResponseEntity.ok(ApiResponse.success(avg));
+    }
+
+    @GetMapping("/{postId}/rating-users/count")
+    public ResponseEntity<ApiResponse<Long>> getRatingUserCount(@PathVariable Long postId) {
+        Long count = postRatingService.getRatingUserCount(postId);
+        return ResponseEntity.ok(ApiResponse.success(count));
+    }
 }