基于用户共享率设置阈值,不满足无法下载资源,同时保障新用户(下载量较低)不受限制

Change-Id: I0842c58bda251c05eb5d0a42e126fd39ac76190b
diff --git a/src/main/java/com/pt/controller/ResourceController.java b/src/main/java/com/pt/controller/ResourceController.java
index 3e3c875..306851a 100644
--- a/src/main/java/com/pt/controller/ResourceController.java
+++ b/src/main/java/com/pt/controller/ResourceController.java
@@ -25,6 +25,8 @@
 
     @Autowired
     private ResourceService resourceService;
+
+    @Autowired
     private UserService userService;
 
     @GetMapping("/list/all")
@@ -129,6 +131,30 @@
             return ResponseEntity.badRequest().body(ans);
         }
 
+        User user = userService.findByUsername(username);
+        if (user == null) {
+            ans.put("message", "User not found");
+            return ResponseEntity.status(404).body(ans);
+        }
+
+        final double MIN_SHARE_RATIO_THRESHOLD = 0.5; // 最低共享率要求
+        final long DOWNLOAD_EXEMPTION_BYTES = 20L * 1024L * 1024L * 1024L; // 20GB下载量豁免
+
+        long uploaded = user.getUploaded();
+        long downloaded = user.getDownloaded();
+
+        // 如果用户的下载量超过豁免值,则检查其共享率
+        if (downloaded > DOWNLOAD_EXEMPTION_BYTES) {
+            // 防止除以零
+            double shareRatio = (downloaded == 0) ? Double.MAX_VALUE : (double) uploaded / downloaded;
+            if (shareRatio < MIN_SHARE_RATIO_THRESHOLD) {
+                ans.put("message", "Share ratio is too low. Please seed more to improve your ratio before downloading new resources.");
+                ans.put("current_share_ratio", String.format("%.2f", shareRatio));
+                ans.put("required_share_ratio", MIN_SHARE_RATIO_THRESHOLD);
+                return ResponseEntity.status(403).body(ans); // 403 Forbidden
+            }
+        }
+
         Resource resource = resourceService.getResourceById(resourceId);
         byte[] file = resourceService.getTorrentFileByResource(resource, username);
         if (file == null) {