blob: 577b2a34cb35ea656460f63f46d8fd96ce059f5b [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<>();
22301102aadb0ac2025-06-05 18:02:21 +080059 ans.put("result", "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")
22301102aadb0ac2025-06-05 18:02:21 +080067 public ResponseEntity<?> loginUser(@RequestParam("username") String username,
68 @RequestParam("password") String password) {
69
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);
22301102aadb0ac2025-06-05 18:02:21 +080079 ans.put("result", "Login successful");
80 ans.put("data", token);
2230110210198562025-05-17 16:27:12 +080081 return ResponseEntity.ok().body(ans);
22301102e0c7c6e2025-05-17 11:08:45 +080082 } else {
22301102aadb0ac2025-06-05 18:02:21 +080083 ans.put("result", "Invalid username or password");
2230110210198562025-05-17 16:27:12 +080084 return ResponseEntity.badRequest().body(ans);
22301102e0c7c6e2025-05-17 11:08:45 +080085 }
86 }
87
88 @PostMapping("/update/username")
2230110210198562025-05-17 16:27:12 +080089 public ResponseEntity<?> updateUsername(@RequestHeader("token") String token,
90 @RequestParam("username") String oldUsername,
22301102e0c7c6e2025-05-17 11:08:45 +080091 @RequestParam("newUsername") String newUsername) {
22301102aadb0ac2025-06-05 18:02:21 +080092 Map<String, Object> ans = new HashMap<>();
2230110210198562025-05-17 16:27:12 +080093 if(!JWTUtils.checkToken(token, oldUsername, Constants.UserRole.USER)) {
22301102aadb0ac2025-06-05 18:02:21 +080094 ans.put("result", "Invalid token");
95 return ResponseEntity.badRequest().body(ans);
2230110210198562025-05-17 16:27:12 +080096 }
97
22301102e0c7c6e2025-05-17 11:08:45 +080098 User user = userService.findByUsername(oldUsername);
99 if (user != null) {
100 user.setUsername(newUsername);
101 userService.save(user);
22301102aadb0ac2025-06-05 18:02:21 +0800102 ans.put("result", "Username updated successfully");
103 return ResponseEntity.ok(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800104 } else {
22301102aadb0ac2025-06-05 18:02:21 +0800105 ans.put("result", "User not found");
106 return ResponseEntity.badRequest().body(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800107 }
108 }
109
110 @PostMapping("/update/password")
2230110210198562025-05-17 16:27:12 +0800111 public ResponseEntity<?> updatePassword(@RequestHeader("token") String token,
112 @RequestParam("username") String username,
22301102e0c7c6e2025-05-17 11:08:45 +0800113 @RequestParam("newPassword") String newPassword) {
22301102aadb0ac2025-06-05 18:02:21 +0800114 Map<String, Object> ans = new HashMap<>();
2230110210198562025-05-17 16:27:12 +0800115 if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)) {
22301102aadb0ac2025-06-05 18:02:21 +0800116 ans.put("result", "Invalid token");
117 return ResponseEntity.badRequest().body(ans);
2230110210198562025-05-17 16:27:12 +0800118 }
119
22301102e0c7c6e2025-05-17 11:08:45 +0800120 User user = userService.findByUsername(username);
121 if (user != null) {
122 user.setPassword(newPassword);
123 userService.save(user);
22301102aadb0ac2025-06-05 18:02:21 +0800124 ans.put("result", "Password updated successfully");
125 return ResponseEntity.ok(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800126 } else {
22301102aadb0ac2025-06-05 18:02:21 +0800127 ans.put("result", "Invalid username or password");
128 return ResponseEntity.badRequest().body(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800129 }
130 }
131
132 @PostMapping("/update/email")
2230110210198562025-05-17 16:27:12 +0800133 public ResponseEntity<?> updateEmail(@RequestHeader("token") String token,
134 @RequestParam("username") String username,
22301102e0c7c6e2025-05-17 11:08:45 +0800135 @RequestParam("newEmail") String newEmail) {
22301102aadb0ac2025-06-05 18:02:21 +0800136
137 Map<String, Object> ans = new HashMap<>();
2230110210198562025-05-17 16:27:12 +0800138 if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)) {
22301102aadb0ac2025-06-05 18:02:21 +0800139 ans.put("result", "Invalid token");
140 return ResponseEntity.badRequest().body(ans);
2230110210198562025-05-17 16:27:12 +0800141 }
142
22301102e0c7c6e2025-05-17 11:08:45 +0800143 User user = userService.findByUsername(username);
144 if (user != null) {
145 user.setEmail(newEmail);
146 userService.save(user);
22301102aadb0ac2025-06-05 18:02:21 +0800147 ans.put("result", "Email updated successfully");
148 return ResponseEntity.ok(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800149 } else {
22301102aadb0ac2025-06-05 18:02:21 +0800150 ans.put("result", "User not found");
151 return ResponseEntity.badRequest().body(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800152 }
153 }
22301102aa5adbc2025-05-18 17:51:55 +0800154
155 @DeleteMapping("/delete")
156 public ResponseEntity<?> deleteUser(@RequestHeader("token") String token,
157 @RequestParam("username") String username,
158 @RequestParam("targetUsername") String targetUsername
159 ) {
22301102aadb0ac2025-06-05 18:02:21 +0800160 Map<String, Object> ans = new HashMap<>();
22301102aa5adbc2025-05-18 17:51:55 +0800161 if(!JWTUtils.checkToken(token, username, Constants.UserRole.ADMIN)) {
22301102aadb0ac2025-06-05 18:02:21 +0800162 ans.put("result", "Invalid token");
163 return ResponseEntity.badRequest().body(ans);
22301102aa5adbc2025-05-18 17:51:55 +0800164 }
165
166 User user = userService.findByUsername(targetUsername);
167 if (user != null) {
168 userService.deleteById(user.getUid());
22301102aadb0ac2025-06-05 18:02:21 +0800169 ans.put("result", "User deleted successfully");
170 return ResponseEntity.ok(ans);
22301102aa5adbc2025-05-18 17:51:55 +0800171 } else {
22301102aadb0ac2025-06-05 18:02:21 +0800172 ans.put("result", "User not found");
173 return ResponseEntity.badRequest().body(ans);
22301102aa5adbc2025-05-18 17:51:55 +0800174 }
175 }
176
177 @GetMapping("/list")
178 public ResponseEntity<?> listUsers(@RequestHeader("token") String token,
179 @RequestParam("username") String username) {
180 if(!JWTUtils.checkToken(token, username, Constants.UserRole.ADMIN)) {
181 return ResponseEntity.badRequest().body("Invalid token");
182 }
183
184 Map<String, Object> ans = new HashMap<>();
185 ans.put("result", "User list retrieved successfully");
22301102aadb0ac2025-06-05 18:02:21 +0800186 ans.put("data", Map.of(
187 "amount", userService.listAll().size(),
188 "users", userService.listAll()
189 ));
22301102aa5adbc2025-05-18 17:51:55 +0800190 return ResponseEntity.ok(ans);
191 }
192
193 @GetMapping("/get/info")
194 public ResponseEntity<?> getUserInfo(@RequestHeader("token") String token,
195 @RequestParam("username") String username) {
22301102aadb0ac2025-06-05 18:02:21 +0800196 Map<String, Object> ans = new HashMap<>();
22301102aa5adbc2025-05-18 17:51:55 +0800197 if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)) {
22301102aadb0ac2025-06-05 18:02:21 +0800198 ans.put("result", "Invalid token");
199 return ResponseEntity.badRequest().body(ans);
22301102aa5adbc2025-05-18 17:51:55 +0800200 }
201
202 User user = userService.findByUsername(username);
203 if (user != null) {
22301102aa5adbc2025-05-18 17:51:55 +0800204 ans.put("result", "User info retrieved successfully");
22301102aadb0ac2025-06-05 18:02:21 +0800205 ans.put("data", user);
22301102aa5adbc2025-05-18 17:51:55 +0800206 return ResponseEntity.ok(ans);
207 } else {
22301102aadb0ac2025-06-05 18:02:21 +0800208 ans.put("result", "User not found");
209 return ResponseEntity.badRequest().body(ans);
22301102aa5adbc2025-05-18 17:51:55 +0800210 }
211 }
22301102e0c7c6e2025-05-17 11:08:45 +0800212}