完成部分资源功能

Change-Id: Idfaef80363ef191a294e52ae53cdd4e2b3e7ccef
diff --git a/src/main/java/com/pt/controller/ResourceController.java b/src/main/java/com/pt/controller/ResourceController.java
index caf2050..8e08e16 100644
--- a/src/main/java/com/pt/controller/ResourceController.java
+++ b/src/main/java/com/pt/controller/ResourceController.java
@@ -1,10 +1,8 @@
 package com.pt.controller;
 
-import com.pt.Item.ResourceInfo;
 import com.pt.constant.Constants;
 import com.pt.entity.Resource;
 import com.pt.entity.User;
-import com.pt.service.DownloadService;
 import com.pt.service.ResourceService;
 import com.pt.service.UserService;
 import com.pt.utils.JWTUtils;
@@ -12,10 +10,11 @@
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.ArrayList;
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.io.File;
 
 @RestController
 @RequestMapping("/api/resource")
@@ -25,7 +24,6 @@
     @Autowired
     private ResourceService resourceService;
     private UserService userService;
-    private DownloadService downloadService;
 
     @GetMapping("/list/all")
     public ResponseEntity<?> getAllResources(@RequestHeader("token") String token,
@@ -41,27 +39,7 @@
         if (resources.isEmpty()) {
             return ResponseEntity.noContent().build();
         }
-
-        List<ResourceInfo> resourceInfos = new ArrayList<>();
-        for (Resource resource : resources) {
-            ResourceInfo resourceInfo = new ResourceInfo();
-            resourceInfo.setResourceId(resource.getResourceId());
-            resourceInfo.setName(resource.getName());
-            resourceInfo.setSize(resource.getSize());
-            resourceInfo.setDescription(resource.getDescription());
-            resourceInfo.setAuthor(resource.getAuthor());
-            resourceInfo.setPublishTime(resource.getPublishTime());
-
-            int downloadCount = downloadService.searchByResourceId(resource.getResourceId()).size();
-            int seedCount = 0; // TODO: 需要根据tracker信息计算该资源的种子树
-            resourceInfo.setDownloadCount(downloadCount);
-            resourceInfo.setSeedCount(seedCount);
-            resourceInfos.add(resourceInfo);
-        }
-
-        ans.put("message", "Resources retrieved successfully");
-        ans.put("resources", resourceInfos);
-        return ResponseEntity.ok(ans);
+        return ResponseEntity.ok(resources);
     }
 
     @GetMapping("/list/user")
@@ -89,29 +67,30 @@
                                              @RequestParam("description") String description) {
         Map<String, Object> ans = new HashMap<>();
 
-        if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)){
+        if (!JWTUtils.checkToken(token, username, Constants.UserRole.USER)) {
             ans.put("result", "Invalid token");
             return ResponseEntity.badRequest().body(ans);
         }
 
         User user = userService.findByUsername(username);
-        if(user.getLevel() < 2){
+        if (user == null || user.getLevel() < 2) {
             ans.put("result", "Insufficient permissions to publish resources");
             return ResponseEntity.status(403).body(ans);
         }
 
-        /*
-            * TODO: 在这里实现资源发布的逻辑
-            *  需要将资源同步到Tracker服务器
-            *  种子文件需要保存
-         */
-
-        resourceService.publishResource(name, description, username, size);
+        try {
+            resourceService.publishResource(name, description, username, size);
+        } catch (Exception e) {
+            ans.put("result", "Failed to publish resource: " + e.getMessage());
+            return ResponseEntity.status(500).body(ans);
+        }
 
         ans.put("result", "Resource published successfully");
         return ResponseEntity.ok(ans);
     }
 
+
+
     @GetMapping("/get/{resourceId}")
     public ResponseEntity<?> getResourceById(@PathVariable("resourceId") int resourceId,
                                               @RequestHeader("token") String token,
@@ -133,7 +112,7 @@
     @GetMapping("/download/{resourceId}")
     public ResponseEntity<?> downloadResource(@PathVariable("resourceId") int resourceId,
                                               @RequestHeader("token") String token,
-                                              @RequestParam("username") String username) {
+                                              @RequestParam("username") String username) throws IOException {
 
         Map<String, Object> ans = new HashMap<>();
         if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)) {
@@ -141,13 +120,16 @@
             return ResponseEntity.badRequest().body(ans);
         }
 
-        /*
-            * TODO: 在这里实现下载资源的方法
-            *       从本地的种子文件目录获取种子文件
-         */
+        Resource resource = resourceService.getResourceById(resourceId);
+        byte[] file = resourceService.getTorrentFileByResource(resource, username);
+        if (file == null) {
+            return ResponseEntity.notFound().build();
+        }
 
-        // Here you would typically return the file or a download link
-        return ResponseEntity.ok(ans);
+        return ResponseEntity.ok()
+                .header("Content-Type", "application/x-bittorrent")
+                .header("Content-Disposition", "attachment; filename=\"" + resource.getName() + ".torrent\"")
+                .body(file);
     }
 
     @GetMapping("/search")
@@ -176,19 +158,19 @@
         Resource resource = resourceService.getResourceById(resourceId);
 
         if(!JWTUtils.checkToken(token, username, Constants.UserRole.ADMIN) || resource == null || !resource.getAuthor().equals(username)) {
-            ans.put("result", "Invalid token");
+            ans.put("result", "Invalid token or insufficient permissions");
             return ResponseEntity.badRequest().body(ans);
         }
 
-        /*
-            * TODO: 在这里实现删除资源的方法
-            *  需要同步到Tracker服务器
-         */
-
-
-        resourceService.deleteResource(resourceId);
+        try {
+            resourceService.deleteResource(resourceId);
+        } catch (Exception e) {
+            ans.put("result", "Failed to delete resource: " + e.getMessage());
+            return ResponseEntity.status(500).body(ans);
+        }
 
         ans.put("result", "Resource deleted successfully");
         return ResponseEntity.ok(ans);
     }
+
 }