添加API接口,修改DB1文件

Change-Id: I5a493962f5a8b0c60e6944a7d630263789d3b4ee
diff --git a/src/main/java/api/ApiApplication.java b/src/main/java/api/ApiApplication.java
index 93eb640..6d65a81 100644
--- a/src/main/java/api/ApiApplication.java
+++ b/src/main/java/api/ApiApplication.java
@@ -8,4 +8,18 @@
     public static void main(String[] args) {
         SpringApplication.run(ApiApplication.class, args);
     }
+
+    // @Bean
+    // public WebMvcConfigurer corsConfigurer() {
+    //     return new WebMvcConfigurer() {
+    //         @Override
+    //         public void addCorsMappings(CorsRegistry registry) {
+    //             registry.addMapping("/**")
+    //                     .allowedOrigins("*")
+    //                     .allowedMethods("*")
+    //                     .allowedHeaders("*")
+    //                     .exposedHeaders(HttpHeaders.CONTENT_DISPOSITION);
+    //         }
+    //     };
+    // }
 }
\ No newline at end of file
diff --git a/src/main/java/api/ApiController.java b/src/main/java/api/ApiController.java
index a683b0e..d8528db 100644
--- a/src/main/java/api/ApiController.java
+++ b/src/main/java/api/ApiController.java
@@ -2,25 +2,41 @@
 
 import java.io.File;
 
+import javax.annotation.PostConstruct;
+
 import org.springframework.core.io.FileSystemResource;
 import org.springframework.core.io.Resource;
 import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.bind.annotation.CrossOrigin;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 
 import database.Database1;
 import entity.Seed;
 import tracker.Tracker;
 
+
 @RestController
 public class ApiController implements ApiInterface {
 
-    private static Database1 db;
-
+    private static Database1 db1;
     private static Tracker tracker;
+    private static ObjectMapper mapper;
+
+    @PostConstruct
+    public void init() {
+        db1 = new Database1();
+        tracker = new Tracker();
+        mapper = new ObjectMapper();
+        mapper.configure(com.fasterxml.jackson.databind.SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
+    }
 
     @Override
     public ResponseEntity<Integer> saveTorrent(
@@ -37,42 +53,106 @@
             seed.seedsize = "1GB"; // 示例种子大小
             seed.seedtag = tag; // 示例标签
             seed.url = "http://example.com/torrent"; // 示例URL
-            db = new Database1();
-            tracker = new Tracker();
-            int ret = db.RegisterSeed(seed);
-            System.out.println("RegisterSeed ret: " + ret);
-            System.out.println(seed.seedid + " " + seed.seeduserid + " " + seed.title + " " + seed.seedsize + " " + seed.seedtag + " " + seed.url);
+
+            int ret = db1.RegisterSeed(seed);
+            // System.out.println("RegisterSeed ret: " + ret);
+            // System.out.println(seed.seedid + " " + seed.seeduserid + " " + seed.title + " " + seed.seedsize + " " + seed.seedtag + " " + seed.url);
+
             // Convert MultipartFile to File
             File tempFile = File.createTempFile(seed.seedid, file.getOriginalFilename());
             file.transferTo(tempFile);
+
             tracker.SaveTorrent(seed.seedid, tempFile);
+
             // Optionally, delete the temp file after saving if not needed
             // tempFile.delete();
-            return ResponseEntity.ok(0); // 返回 0 表示成功
+
+            // 创建带有 CORS 响应头的 ResponseEntity
+            HttpHeaders headers = new HttpHeaders();
+            headers.add("Access-Control-Allow-Origin", "*"); // 允许所有域名访问,可以根据需要调整为特定域名
+            headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); // 允许的 HTTP 方法
+            headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization"); // 允许的请求头
+
+            return new ResponseEntity<>(0, headers, HttpStatus.OK); // 返回 0 表示成功
         } catch (Exception e) {
             e.printStackTrace();
-            return ResponseEntity.status(500).body(1); // 返回 1 表示失败
+
+            // 创建带有 CORS 响应头的错误 ResponseEntity
+            HttpHeaders errorHeaders = new HttpHeaders();
+            errorHeaders.add("Access-Control-Allow-Origin", "*");
+            errorHeaders.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
+            errorHeaders.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
+
+            return new ResponseEntity<>(1, errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 1 表示失败
         }
     }
 
     @Override
+    @CrossOrigin(origins = "*", allowedHeaders = "*") // 允许所有来源和头部
     public ResponseEntity<Resource> getTorrent(
-        @RequestParam("seedid") String seedid,
-        @RequestParam("userid") String userid,
-        @RequestParam("ip") String ip
+            @RequestParam("torrentId") String seedid,
+            @RequestParam("userId") String userid
     ) {
-        // 实现获取种子文件的逻辑
-        // 示例:从本地目录中查找文件
-        tracker = new Tracker();
-        File file = tracker.GetTTorent(seedid, userid, ip);
+        File file = tracker.GetTTorent(seedid, userid);
         if (file != null) {
             FileSystemResource resource = new FileSystemResource(file);
             return ResponseEntity.ok()
                 .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getName() + "\"")
+                .header(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, HttpHeaders.CONTENT_DISPOSITION) // 关键:允许前端访问Content-Disposition
                 .contentType(MediaType.APPLICATION_OCTET_STREAM)
                 .body(resource);
         } else {
-            return ResponseEntity.notFound().build(); // 返回 404 表示文件未找到
+            return ResponseEntity.notFound().build();
+        }
+    }
+
+    //无按标签查询的函数
+    @Override
+    public ResponseEntity<String> getSeedListByTag(
+        @RequestParam("tag") String tag
+    ) {
+        try {
+            Seed[] seeds = db1.GetSeedListByTag(tag);
+            String json = mapper.writeValueAsString(seeds);
+            // System.out.println("getSeedListByTag: " + json);
+            HttpHeaders headers = new HttpHeaders();
+            headers.add("Access-Control-Allow-Origin", "*");
+            headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
+            headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
+            return new ResponseEntity<>(json, headers, HttpStatus.OK);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            HttpHeaders errorHeaders = new HttpHeaders();
+            errorHeaders.add("Access-Control-Allow-Origin", "*");
+            errorHeaders.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
+            errorHeaders.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @Override
+    public ResponseEntity<String> getTorrentDetail(
+        @RequestParam("id") String seedid
+    ) {
+        try {
+            Seed seed = db1.GetSeedInformation(seedid);
+            if (seed != null) {
+                String json = mapper.writeValueAsString(seed);
+                HttpHeaders headers = new HttpHeaders();
+                headers.add("Access-Control-Allow-Origin", "*");
+                headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
+                headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
+                return new ResponseEntity<>(json, headers, HttpStatus.OK);
+            } else {
+                return ResponseEntity.notFound().build(); // 返回 404 表示种子未找到
+            }
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            HttpHeaders errorHeaders = new HttpHeaders();
+            errorHeaders.add("Access-Control-Allow-Origin", "*");
+            errorHeaders.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
+            errorHeaders.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
+            return new ResponseEntity<>("{}", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
         }
     }
 }
\ No newline at end of file
diff --git a/src/main/java/api/ApiInterface.java b/src/main/java/api/ApiInterface.java
index ab3408c..6859aa6 100644
--- a/src/main/java/api/ApiInterface.java
+++ b/src/main/java/api/ApiInterface.java
@@ -23,8 +23,17 @@
 
     @GetMapping("/get-torrent")
     ResponseEntity<Resource> getTorrent(
-        @RequestParam("seedid") String seedid,
-        @RequestParam("userid") String userid,
-        @RequestParam("ip") String ip
+        @RequestParam("torrentId") String seedid,
+        @RequestParam("userId") String userid
+    );
+
+    @GetMapping("/get-seed-list-by-tag")
+    ResponseEntity<String> getSeedListByTag(
+        @RequestParam("tag") String tag
+    );
+
+    @GetMapping("/torrent-detail")
+    ResponseEntity<String> getTorrentDetail(
+        @RequestParam("id") String seedid
     );
 }
\ No newline at end of file