添加bt与tracker交互

Change-Id: I1327c2ed89a76bee8e2abeb8cb3014b56357689a
diff --git a/src/main/java/com/pt/controller/ResourceController.java b/src/main/java/com/pt/controller/ResourceController.java
index 8e08e16..411e7bc 100644
--- a/src/main/java/com/pt/controller/ResourceController.java
+++ b/src/main/java/com/pt/controller/ResourceController.java
@@ -9,6 +9,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.util.HashMap;
@@ -60,11 +61,14 @@
     }
 
     @PostMapping("/publish")
-    public ResponseEntity<?> publishResource(@RequestHeader("token") String token,
-                                             @RequestParam("username") String username,
-                                             @RequestParam("size") double size,
-                                             @RequestParam("name") String name,
-                                             @RequestParam("description") String description) {
+    public ResponseEntity<?> publishResource(
+            @RequestHeader("token") String token,
+            @RequestParam("username") String username,
+            @RequestParam("size") double size,
+            @RequestParam("name") String name,
+            @RequestParam("description") String description,
+            @RequestParam("torrent") MultipartFile torrentFile) {
+
         Map<String, Object> ans = new HashMap<>();
 
         if (!JWTUtils.checkToken(token, username, Constants.UserRole.USER)) {
@@ -79,7 +83,8 @@
         }
 
         try {
-            resourceService.publishResource(name, description, username, size);
+            // 传入种子文件字节,同时传入资源其他信息
+            resourceService.publishResource(name, description, username, size, torrentFile.getBytes());
         } catch (Exception e) {
             ans.put("result", "Failed to publish resource: " + e.getMessage());
             return ResponseEntity.status(500).body(ans);
@@ -91,6 +96,7 @@
 
 
 
+
     @GetMapping("/get/{resourceId}")
     public ResponseEntity<?> getResourceById(@PathVariable("resourceId") int resourceId,
                                               @RequestHeader("token") String token,
diff --git a/src/main/java/com/pt/controller/TrackerController.java b/src/main/java/com/pt/controller/TrackerController.java
new file mode 100644
index 0000000..1e0302d
--- /dev/null
+++ b/src/main/java/com/pt/controller/TrackerController.java
@@ -0,0 +1,36 @@
+package com.pt.controller;
+
+import com.pt.service.TrackerService;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.Map;
+
+@RestController
+public class TrackerController {
+
+    @Autowired
+    private TrackerService trackerService;
+
+    @GetMapping("/announce")
+    public void announce(HttpServletRequest request, HttpServletResponse response) throws IOException {
+        try {
+            String ip = request.getRemoteAddr();
+            Map<String, String[]> params = request.getParameterMap();
+
+            byte[] bencodedResponse = trackerService.handleAnnounce(params, ip);
+
+            response.setContentType("application/x-bittorrent");
+            response.getOutputStream().write(bencodedResponse);
+        } catch (Exception e) {
+            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+            response.setContentType("text/plain");
+            response.getWriter().write("Tracker internal error: " + e.getMessage());
+        }
+    }
+
+}
+