blob: d8528db48d7e1a6e13a65e82633f0e593870de3a [file] [log] [blame]
Raverf79fdb62025-06-03 06:02:49 +00001package api;
2
3import java.io.File;
4
Raveraae06122025-06-05 08:13:35 +00005import javax.annotation.PostConstruct;
6
Raverf79fdb62025-06-03 06:02:49 +00007import org.springframework.core.io.FileSystemResource;
8import org.springframework.core.io.Resource;
9import org.springframework.http.HttpHeaders;
Raveraae06122025-06-05 08:13:35 +000010import org.springframework.http.HttpStatus;
Raverf79fdb62025-06-03 06:02:49 +000011import org.springframework.http.MediaType;
12import org.springframework.http.ResponseEntity;
13import org.springframework.web.bind.annotation.RequestParam;
14import org.springframework.web.bind.annotation.RestController;
15import org.springframework.web.multipart.MultipartFile;
Raveraae06122025-06-05 08:13:35 +000016import org.springframework.web.bind.annotation.CrossOrigin;
17
18import com.fasterxml.jackson.core.JsonProcessingException;
19import com.fasterxml.jackson.databind.ObjectMapper;
Raverf79fdb62025-06-03 06:02:49 +000020
21import database.Database1;
22import entity.Seed;
23import tracker.Tracker;
24
Raveraae06122025-06-05 08:13:35 +000025
Raverf79fdb62025-06-03 06:02:49 +000026@RestController
27public class ApiController implements ApiInterface {
28
Raveraae06122025-06-05 08:13:35 +000029 private static Database1 db1;
Raverf79fdb62025-06-03 06:02:49 +000030 private static Tracker tracker;
Raveraae06122025-06-05 08:13:35 +000031 private static ObjectMapper mapper;
32
33 @PostConstruct
34 public void init() {
35 db1 = new Database1();
36 tracker = new Tracker();
37 mapper = new ObjectMapper();
38 mapper.configure(com.fasterxml.jackson.databind.SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
39 }
Raverf79fdb62025-06-03 06:02:49 +000040
41 @Override
42 public ResponseEntity<Integer> saveTorrent(
43 @RequestParam("userid") String userid,
44 @RequestParam("title") String title,
45 @RequestParam("tag") String tag,
46 @RequestParam("file") MultipartFile file
47 ) {
48 try {
49 Seed seed = new Seed();
50 seed.seedid = "exampleSeedId"; // 示例种子ID
51 seed.seeduserid = userid; // 示例用户ID
52 seed.title = title; // 示例标题
53 seed.seedsize = "1GB"; // 示例种子大小
54 seed.seedtag = tag; // 示例标签
55 seed.url = "http://example.com/torrent"; // 示例URL
Raveraae06122025-06-05 08:13:35 +000056
57 int ret = db1.RegisterSeed(seed);
58 // System.out.println("RegisterSeed ret: " + ret);
59 // System.out.println(seed.seedid + " " + seed.seeduserid + " " + seed.title + " " + seed.seedsize + " " + seed.seedtag + " " + seed.url);
60
Raverf79fdb62025-06-03 06:02:49 +000061 // Convert MultipartFile to File
62 File tempFile = File.createTempFile(seed.seedid, file.getOriginalFilename());
63 file.transferTo(tempFile);
Raveraae06122025-06-05 08:13:35 +000064
Raverf79fdb62025-06-03 06:02:49 +000065 tracker.SaveTorrent(seed.seedid, tempFile);
Raveraae06122025-06-05 08:13:35 +000066
Raverf79fdb62025-06-03 06:02:49 +000067 // Optionally, delete the temp file after saving if not needed
68 // tempFile.delete();
Raveraae06122025-06-05 08:13:35 +000069
70 // 创建带有 CORS 响应头的 ResponseEntity
71 HttpHeaders headers = new HttpHeaders();
72 headers.add("Access-Control-Allow-Origin", "*"); // 允许所有域名访问,可以根据需要调整为特定域名
73 headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); // 允许的 HTTP 方法
74 headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization"); // 允许的请求头
75
76 return new ResponseEntity<>(0, headers, HttpStatus.OK); // 返回 0 表示成功
Raverf79fdb62025-06-03 06:02:49 +000077 } catch (Exception e) {
78 e.printStackTrace();
Raveraae06122025-06-05 08:13:35 +000079
80 // 创建带有 CORS 响应头的错误 ResponseEntity
81 HttpHeaders errorHeaders = new HttpHeaders();
82 errorHeaders.add("Access-Control-Allow-Origin", "*");
83 errorHeaders.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
84 errorHeaders.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
85
86 return new ResponseEntity<>(1, errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 1 表示失败
Raverf79fdb62025-06-03 06:02:49 +000087 }
88 }
89
90 @Override
Raveraae06122025-06-05 08:13:35 +000091 @CrossOrigin(origins = "*", allowedHeaders = "*") // 允许所有来源和头部
Raverf79fdb62025-06-03 06:02:49 +000092 public ResponseEntity<Resource> getTorrent(
Raveraae06122025-06-05 08:13:35 +000093 @RequestParam("torrentId") String seedid,
94 @RequestParam("userId") String userid
Raverf79fdb62025-06-03 06:02:49 +000095 ) {
Raveraae06122025-06-05 08:13:35 +000096 File file = tracker.GetTTorent(seedid, userid);
Raverf79fdb62025-06-03 06:02:49 +000097 if (file != null) {
98 FileSystemResource resource = new FileSystemResource(file);
99 return ResponseEntity.ok()
100 .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getName() + "\"")
Raveraae06122025-06-05 08:13:35 +0000101 .header(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, HttpHeaders.CONTENT_DISPOSITION) // 关键:允许前端访问Content-Disposition
Raverf79fdb62025-06-03 06:02:49 +0000102 .contentType(MediaType.APPLICATION_OCTET_STREAM)
103 .body(resource);
104 } else {
Raveraae06122025-06-05 08:13:35 +0000105 return ResponseEntity.notFound().build();
106 }
107 }
108
109 //无按标签查询的函数
110 @Override
111 public ResponseEntity<String> getSeedListByTag(
112 @RequestParam("tag") String tag
113 ) {
114 try {
115 Seed[] seeds = db1.GetSeedListByTag(tag);
116 String json = mapper.writeValueAsString(seeds);
117 // System.out.println("getSeedListByTag: " + json);
118 HttpHeaders headers = new HttpHeaders();
119 headers.add("Access-Control-Allow-Origin", "*");
120 headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
121 headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
122 return new ResponseEntity<>(json, headers, HttpStatus.OK);
123 } catch (JsonProcessingException e) {
124 e.printStackTrace();
125 HttpHeaders errorHeaders = new HttpHeaders();
126 errorHeaders.add("Access-Control-Allow-Origin", "*");
127 errorHeaders.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
128 errorHeaders.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
129 return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
130 }
131 }
132
133 @Override
134 public ResponseEntity<String> getTorrentDetail(
135 @RequestParam("id") String seedid
136 ) {
137 try {
138 Seed seed = db1.GetSeedInformation(seedid);
139 if (seed != null) {
140 String json = mapper.writeValueAsString(seed);
141 HttpHeaders headers = new HttpHeaders();
142 headers.add("Access-Control-Allow-Origin", "*");
143 headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
144 headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
145 return new ResponseEntity<>(json, headers, HttpStatus.OK);
146 } else {
147 return ResponseEntity.notFound().build(); // 返回 404 表示种子未找到
148 }
149 } catch (JsonProcessingException e) {
150 e.printStackTrace();
151 HttpHeaders errorHeaders = new HttpHeaders();
152 errorHeaders.add("Access-Control-Allow-Origin", "*");
153 errorHeaders.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
154 errorHeaders.add("Access-Control-Allow-Headers", "Content-Type, Authorization");
155 return new ResponseEntity<>("{}", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
Raverf79fdb62025-06-03 06:02:49 +0000156 }
157 }
158}