blob: 4cadd75aba28cb3f64e846d33b573e6e83ee7eca [file] [log] [blame]
22301102e0c7c6e2025-05-17 11:08:45 +08001package com.pt.controller;
2
2230110210198562025-05-17 16:27:12 +08003import com.pt.constant.Constants;
22301102e0c7c6e2025-05-17 11:08:45 +08004import com.pt.entity.User;
22301102d526daa2025-06-07 10:53:27 +08005import com.pt.service.InvitedCodeService;
2230110210198562025-05-17 16:27:12 +08006import com.pt.utils.JWTUtils;
22301102e0c7c6e2025-05-17 11:08:45 +08007import org.springframework.beans.factory.annotation.Autowired;
8import org.springframework.http.ResponseEntity;
9import org.springframework.web.bind.annotation.*;
10import com.pt.service.UserService;
11
2230110210198562025-05-17 16:27:12 +080012import java.util.HashMap;
13import java.util.Map;
14
22301102e0c7c6e2025-05-17 11:08:45 +080015@RestController
16@RequestMapping("/api/user")
17@CrossOrigin(origins = "*")
18public class UserController {
19
20 @Autowired
21 private UserService userService;
22301102d526daa2025-06-07 10:53:27 +080022 private InvitedCodeService invitedCodeService;
22301102e0c7c6e2025-05-17 11:08:45 +080023
24 @PostMapping("/register")
yyyang502ab1d2025-06-03 16:40:59 +080025 public ResponseEntity<?> registerUser(@RequestBody Map<String, String> request) {
26 String username = request.get("username");
27 String password = request.get("password");
28 String email = request.get("email");
29
30 if (username == null || password == null || email == null) {
31 return ResponseEntity.badRequest().body("Missing required fields");
32 }
33
22301102e0c7c6e2025-05-17 11:08:45 +080034 User user = userService.findByUsername(username);
35 if (user != null) {
36 return ResponseEntity.badRequest().body("User already exists");
37 } else {
38 User newUser = new User();
39
22301102d526daa2025-06-07 10:53:27 +080040 if(request.get("invitedCode") != null) {
41 String invitedCode = request.get("invitedCode");
42 if (!invitedCodeService.isCodeValid(invitedCode)) {
43 return ResponseEntity.badRequest().body("Invalid invited code");
44 }
45 else {
46 newUser.setLevel(Constants.UserLevel.FRESH.getValue());
47 newUser.setPoints(300);
48 }
49 }
50
22301102e0c7c6e2025-05-17 11:08:45 +080051 String uid = String.valueOf(System.currentTimeMillis());
52 newUser.setUid(uid);
53 newUser.setUsername(username);
54 newUser.setPassword(password);
55 newUser.setEmail(email);
56 userService.save(newUser);
2230110210198562025-05-17 16:27:12 +080057
58 Map<String, Object> ans = new HashMap<>();
22301102f69709e2025-06-08 14:10:02 +080059 ans.put("message", "User registered successfully");
yyyang502ab1d2025-06-03 16:40:59 +080060 ans.put("data", newUser);
2230110210198562025-05-17 16:27:12 +080061
62 return ResponseEntity.ok().body(ans);
22301102e0c7c6e2025-05-17 11:08:45 +080063 }
64 }
65
66 @PostMapping("/login")
22301102f69709e2025-06-08 14:10:02 +080067 public ResponseEntity<?> loginUser(@RequestBody Map<String, String> request) {
68 String username = request.get("username");
69 String password = request.get("password");
yyyang502ab1d2025-06-03 16:40:59 +080070
71 if (username == null || password == null) {
72 return ResponseEntity.badRequest().body("Missing username or password");
73 }
2230110210198562025-05-17 16:27:12 +080074
22301102e0c7c6e2025-05-17 11:08:45 +080075 User user = userService.findByUsernameAndPassword(username, password);
2230110210198562025-05-17 16:27:12 +080076 Map<String, Object> ans = new HashMap<>();
22301102e0c7c6e2025-05-17 11:08:45 +080077 if (user != null) {
yyyang502ab1d2025-06-03 16:40:59 +080078 String token = JWTUtils.generateToken(username, Constants.UserRole.USER, Constants.DEFAULT_EXPIRE_TIME);
22301102f69709e2025-06-08 14:10:02 +080079 ans.put("message", "Login successful");
22301102f5670302025-06-08 14:10:02 +080080 ans.put("data", Map.of(
81 "token", token,
82 "uid", user.getUid(),
83 "username", user.getUsername(),
84 "email", user.getEmail(),
85 "level", user.getLevel(),
Edwardsamaxl25305242025-06-09 21:17:29 +080086 "points", user.getPoints(),
87 "uploaded", user.getUploaded(),
88 "downloaded", user.getDownloaded(),
89 "shareRatio", user.getShareRatio()
22301102f5670302025-06-08 14:10:02 +080090 ));
2230110210198562025-05-17 16:27:12 +080091 return ResponseEntity.ok().body(ans);
22301102e0c7c6e2025-05-17 11:08:45 +080092 } else {
22301102f69709e2025-06-08 14:10:02 +080093 ans.put("message", "Invalid username or password");
2230110210198562025-05-17 16:27:12 +080094 return ResponseEntity.badRequest().body(ans);
22301102e0c7c6e2025-05-17 11:08:45 +080095 }
96 }
97
98 @PostMapping("/update/username")
2230110210198562025-05-17 16:27:12 +080099 public ResponseEntity<?> updateUsername(@RequestHeader("token") String token,
22301102f69709e2025-06-08 14:10:02 +0800100 @RequestBody Map<String, String> request) {
101 String oldUsername = request.get("username");
102 String newUsername = request.get("newUsername");
103
22301102aadb0ac2025-06-05 18:02:21 +0800104 Map<String, Object> ans = new HashMap<>();
2230110210198562025-05-17 16:27:12 +0800105 if(!JWTUtils.checkToken(token, oldUsername, Constants.UserRole.USER)) {
22301102f69709e2025-06-08 14:10:02 +0800106 ans.put("message", "Invalid token");
22301102aadb0ac2025-06-05 18:02:21 +0800107 return ResponseEntity.badRequest().body(ans);
2230110210198562025-05-17 16:27:12 +0800108 }
109
22301102e0c7c6e2025-05-17 11:08:45 +0800110 User user = userService.findByUsername(oldUsername);
111 if (user != null) {
112 user.setUsername(newUsername);
113 userService.save(user);
22301102f69709e2025-06-08 14:10:02 +0800114 ans.put("message", "Username updated successfully");
22301102aadb0ac2025-06-05 18:02:21 +0800115 return ResponseEntity.ok(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800116 } else {
22301102f69709e2025-06-08 14:10:02 +0800117 ans.put("message", "User not found");
22301102aadb0ac2025-06-05 18:02:21 +0800118 return ResponseEntity.badRequest().body(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800119 }
120 }
121
122 @PostMapping("/update/password")
2230110210198562025-05-17 16:27:12 +0800123 public ResponseEntity<?> updatePassword(@RequestHeader("token") String token,
22301102f69709e2025-06-08 14:10:02 +0800124 @RequestBody Map<String, String> request
125 ) {
126 String username = request.get("username");
127 String newPassword = request.get("newPassword");
128
22301102aadb0ac2025-06-05 18:02:21 +0800129 Map<String, Object> ans = new HashMap<>();
2230110210198562025-05-17 16:27:12 +0800130 if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)) {
22301102f69709e2025-06-08 14:10:02 +0800131 ans.put("message", "Invalid token");
22301102aadb0ac2025-06-05 18:02:21 +0800132 return ResponseEntity.badRequest().body(ans);
2230110210198562025-05-17 16:27:12 +0800133 }
134
22301102e0c7c6e2025-05-17 11:08:45 +0800135 User user = userService.findByUsername(username);
136 if (user != null) {
137 user.setPassword(newPassword);
138 userService.save(user);
22301102f69709e2025-06-08 14:10:02 +0800139 ans.put("message", "Password updated successfully");
22301102aadb0ac2025-06-05 18:02:21 +0800140 return ResponseEntity.ok(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800141 } else {
22301102f69709e2025-06-08 14:10:02 +0800142 ans.put("message", "Invalid username or password");
22301102aadb0ac2025-06-05 18:02:21 +0800143 return ResponseEntity.badRequest().body(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800144 }
145 }
146
147 @PostMapping("/update/email")
2230110210198562025-05-17 16:27:12 +0800148 public ResponseEntity<?> updateEmail(@RequestHeader("token") String token,
22301102f69709e2025-06-08 14:10:02 +0800149 @RequestBody Map<String, String> request) {
150 String username = request.get("username");
151 String newEmail = request.get("newEmail");
22301102aadb0ac2025-06-05 18:02:21 +0800152
153 Map<String, Object> ans = new HashMap<>();
2230110210198562025-05-17 16:27:12 +0800154 if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)) {
22301102f69709e2025-06-08 14:10:02 +0800155 ans.put("message", "Invalid token");
22301102aadb0ac2025-06-05 18:02:21 +0800156 return ResponseEntity.badRequest().body(ans);
2230110210198562025-05-17 16:27:12 +0800157 }
158
22301102e0c7c6e2025-05-17 11:08:45 +0800159 User user = userService.findByUsername(username);
160 if (user != null) {
161 user.setEmail(newEmail);
162 userService.save(user);
22301102f69709e2025-06-08 14:10:02 +0800163 ans.put("message", "Email updated successfully");
22301102aadb0ac2025-06-05 18:02:21 +0800164 return ResponseEntity.ok(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800165 } else {
22301102f69709e2025-06-08 14:10:02 +0800166 ans.put("message", "User not found");
22301102aadb0ac2025-06-05 18:02:21 +0800167 return ResponseEntity.badRequest().body(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800168 }
169 }
22301102aa5adbc2025-05-18 17:51:55 +0800170
171 @DeleteMapping("/delete")
172 public ResponseEntity<?> deleteUser(@RequestHeader("token") String token,
22301102f5670302025-06-08 14:10:02 +0800173 @RequestParam("username") String username,
174 @RequestParam("targetUsername") String targetUsername) {
22301102f69709e2025-06-08 14:10:02 +0800175
22301102aadb0ac2025-06-05 18:02:21 +0800176 Map<String, Object> ans = new HashMap<>();
22301102aa5adbc2025-05-18 17:51:55 +0800177 if(!JWTUtils.checkToken(token, username, Constants.UserRole.ADMIN)) {
22301102f69709e2025-06-08 14:10:02 +0800178 ans.put("message", "Invalid token");
22301102aadb0ac2025-06-05 18:02:21 +0800179 return ResponseEntity.badRequest().body(ans);
22301102aa5adbc2025-05-18 17:51:55 +0800180 }
181
182 User user = userService.findByUsername(targetUsername);
183 if (user != null) {
184 userService.deleteById(user.getUid());
22301102f69709e2025-06-08 14:10:02 +0800185 ans.put("message", "User deleted successfully");
22301102aadb0ac2025-06-05 18:02:21 +0800186 return ResponseEntity.ok(ans);
22301102aa5adbc2025-05-18 17:51:55 +0800187 } else {
22301102f69709e2025-06-08 14:10:02 +0800188 ans.put("message", "User not found");
22301102aadb0ac2025-06-05 18:02:21 +0800189 return ResponseEntity.badRequest().body(ans);
22301102aa5adbc2025-05-18 17:51:55 +0800190 }
191 }
192
193 @GetMapping("/list")
194 public ResponseEntity<?> listUsers(@RequestHeader("token") String token,
22301102f5670302025-06-08 14:10:02 +0800195 @RequestParam("username") String username) {
22301102aa5adbc2025-05-18 17:51:55 +0800196 if(!JWTUtils.checkToken(token, username, Constants.UserRole.ADMIN)) {
197 return ResponseEntity.badRequest().body("Invalid token");
198 }
199
200 Map<String, Object> ans = new HashMap<>();
22301102f69709e2025-06-08 14:10:02 +0800201 ans.put("message", "User list retrieved successfully");
22301102aadb0ac2025-06-05 18:02:21 +0800202 ans.put("data", Map.of(
203 "amount", userService.listAll().size(),
204 "users", userService.listAll()
205 ));
22301102aa5adbc2025-05-18 17:51:55 +0800206 return ResponseEntity.ok(ans);
207 }
208
209 @GetMapping("/get/info")
210 public ResponseEntity<?> getUserInfo(@RequestHeader("token") String token,
211 @RequestParam("username") String username) {
22301102f69709e2025-06-08 14:10:02 +0800212
22301102aadb0ac2025-06-05 18:02:21 +0800213 Map<String, Object> ans = new HashMap<>();
22301102f5670302025-06-08 14:10:02 +0800214 System.out.println("Enter user info ");
22301102aa5adbc2025-05-18 17:51:55 +0800215 if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)) {
22301102f69709e2025-06-08 14:10:02 +0800216 ans.put("message", "Invalid token");
22301102f5670302025-06-08 14:10:02 +0800217 System.out.println("Invalid token");
22301102aadb0ac2025-06-05 18:02:21 +0800218 return ResponseEntity.badRequest().body(ans);
22301102aa5adbc2025-05-18 17:51:55 +0800219 }
220
221 User user = userService.findByUsername(username);
222 if (user != null) {
22301102f69709e2025-06-08 14:10:02 +0800223 ans.put("message", "User info retrieved successfully");
22301102aadb0ac2025-06-05 18:02:21 +0800224 ans.put("data", user);
22301102f5670302025-06-08 14:10:02 +0800225 System.out.println("User info retrieved successfully");
22301102aa5adbc2025-05-18 17:51:55 +0800226 return ResponseEntity.ok(ans);
227 } else {
22301102f69709e2025-06-08 14:10:02 +0800228 ans.put("message", "User not found");
22301102f5670302025-06-08 14:10:02 +0800229 System.out.println("User not found");
22301102aadb0ac2025-06-05 18:02:21 +0800230 return ResponseEntity.badRequest().body(ans);
22301102aa5adbc2025-05-18 17:51:55 +0800231 }
232 }
22301102f5670302025-06-08 14:10:02 +0800233
234 /**
235 * 获取用户统计信息
236 */
237 @GetMapping("/stats/{username}")
238 public ResponseEntity<?> getUserStats(
239 @RequestHeader("token") String token,
240 @PathVariable String username) {
241
242 Map<String, Object> ans = new HashMap<>();
243
244 if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)) {
245 ans.put("message", "Invalid token");
246 return ResponseEntity.badRequest().body(ans);
247 }
248
249 User user = userService.findByUsername(username);
250 if (user == null) {
251 ans.put("message", "User not found");
252 return ResponseEntity.badRequest().body(ans);
253 }
254
255 // 计算分享率
256 double ratio = user.getDownloaded() == 0 ?
257 (user.getUploaded() > 0 ? Double.MAX_VALUE : 0) :
258 (double) user.getUploaded() / user.getDownloaded();
259
260 // 格式化分享率为两位小数
261 ratio = Math.round(ratio * 100.0) / 100.0;
262
263 // 构建返回数据
264 Map<String, Object> stats = new HashMap<>();
265 double uploadSize = user.getUploaded() / (1024.0 * 1024.0 * 1024.0);
266 double downloadSize = user.getDownloaded() / (1024.0 * 1024.0 * 1024.0);
267
268 stats.put("uploadSize", uploadSize); // 转换为GB
269 stats.put("downloadSize", downloadSize); // 转换为GB
270 stats.put("ratio", ratio);
271 stats.put("points", user.getPoints());
272 stats.put("userClass", getUserClass(user.getLevel()));
273 stats.put("level", user.getLevel());
274
275 ans.put("message", "User stats retrieved successfully");
276 ans.put("data", stats);
277 return ResponseEntity.ok(ans);
278 }
279
280 /**
281 * 根据用户等级返回对应的用户类别名称
282 */
283 private String getUserClass(int level) {
284 switch (level) {
285 case 5: return "大佬";
286 case 4: return "专家";
287 case 3: return "熟练";
288 case 2: return "入门";
289 default: return "新用户";
290 }
291 }
22301102e0c7c6e2025-05-17 11:08:45 +0800292}