blob: 7222f3630f936873ad0072171f2c72a1282d11ff [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");
22301102aadb0ac2025-06-05 18:02:21 +080080 ans.put("data", token);
2230110210198562025-05-17 16:27:12 +080081 return ResponseEntity.ok().body(ans);
22301102e0c7c6e2025-05-17 11:08:45 +080082 } else {
22301102f69709e2025-06-08 14:10:02 +080083 ans.put("message", "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,
22301102f69709e2025-06-08 14:10:02 +080090 @RequestBody Map<String, String> request) {
91 String oldUsername = request.get("username");
92 String newUsername = request.get("newUsername");
93
22301102aadb0ac2025-06-05 18:02:21 +080094 Map<String, Object> ans = new HashMap<>();
2230110210198562025-05-17 16:27:12 +080095 if(!JWTUtils.checkToken(token, oldUsername, Constants.UserRole.USER)) {
22301102f69709e2025-06-08 14:10:02 +080096 ans.put("message", "Invalid token");
22301102aadb0ac2025-06-05 18:02:21 +080097 return ResponseEntity.badRequest().body(ans);
2230110210198562025-05-17 16:27:12 +080098 }
99
22301102e0c7c6e2025-05-17 11:08:45 +0800100 User user = userService.findByUsername(oldUsername);
101 if (user != null) {
102 user.setUsername(newUsername);
103 userService.save(user);
22301102f69709e2025-06-08 14:10:02 +0800104 ans.put("message", "Username updated successfully");
22301102aadb0ac2025-06-05 18:02:21 +0800105 return ResponseEntity.ok(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800106 } else {
22301102f69709e2025-06-08 14:10:02 +0800107 ans.put("message", "User not found");
22301102aadb0ac2025-06-05 18:02:21 +0800108 return ResponseEntity.badRequest().body(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800109 }
110 }
111
112 @PostMapping("/update/password")
2230110210198562025-05-17 16:27:12 +0800113 public ResponseEntity<?> updatePassword(@RequestHeader("token") String token,
22301102f69709e2025-06-08 14:10:02 +0800114 @RequestBody Map<String, String> request
115 ) {
116 String username = request.get("username");
117 String newPassword = request.get("newPassword");
118
22301102aadb0ac2025-06-05 18:02:21 +0800119 Map<String, Object> ans = new HashMap<>();
2230110210198562025-05-17 16:27:12 +0800120 if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)) {
22301102f69709e2025-06-08 14:10:02 +0800121 ans.put("message", "Invalid token");
22301102aadb0ac2025-06-05 18:02:21 +0800122 return ResponseEntity.badRequest().body(ans);
2230110210198562025-05-17 16:27:12 +0800123 }
124
22301102e0c7c6e2025-05-17 11:08:45 +0800125 User user = userService.findByUsername(username);
126 if (user != null) {
127 user.setPassword(newPassword);
128 userService.save(user);
22301102f69709e2025-06-08 14:10:02 +0800129 ans.put("message", "Password updated successfully");
22301102aadb0ac2025-06-05 18:02:21 +0800130 return ResponseEntity.ok(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800131 } else {
22301102f69709e2025-06-08 14:10:02 +0800132 ans.put("message", "Invalid username or password");
22301102aadb0ac2025-06-05 18:02:21 +0800133 return ResponseEntity.badRequest().body(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800134 }
135 }
136
137 @PostMapping("/update/email")
2230110210198562025-05-17 16:27:12 +0800138 public ResponseEntity<?> updateEmail(@RequestHeader("token") String token,
22301102f69709e2025-06-08 14:10:02 +0800139 @RequestBody Map<String, String> request) {
140 String username = request.get("username");
141 String newEmail = request.get("newEmail");
22301102aadb0ac2025-06-05 18:02:21 +0800142
143 Map<String, Object> ans = new HashMap<>();
2230110210198562025-05-17 16:27:12 +0800144 if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)) {
22301102f69709e2025-06-08 14:10:02 +0800145 ans.put("message", "Invalid token");
22301102aadb0ac2025-06-05 18:02:21 +0800146 return ResponseEntity.badRequest().body(ans);
2230110210198562025-05-17 16:27:12 +0800147 }
148
22301102e0c7c6e2025-05-17 11:08:45 +0800149 User user = userService.findByUsername(username);
150 if (user != null) {
151 user.setEmail(newEmail);
152 userService.save(user);
22301102f69709e2025-06-08 14:10:02 +0800153 ans.put("message", "Email updated successfully");
22301102aadb0ac2025-06-05 18:02:21 +0800154 return ResponseEntity.ok(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800155 } else {
22301102f69709e2025-06-08 14:10:02 +0800156 ans.put("message", "User not found");
22301102aadb0ac2025-06-05 18:02:21 +0800157 return ResponseEntity.badRequest().body(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800158 }
159 }
22301102aa5adbc2025-05-18 17:51:55 +0800160
161 @DeleteMapping("/delete")
162 public ResponseEntity<?> deleteUser(@RequestHeader("token") String token,
22301102f69709e2025-06-08 14:10:02 +0800163 @RequestBody Map<String, String> request) {
164 String username = request.get("username");
165 String targetUsername = request.get("targetUsername");
166
22301102aadb0ac2025-06-05 18:02:21 +0800167 Map<String, Object> ans = new HashMap<>();
22301102aa5adbc2025-05-18 17:51:55 +0800168 if(!JWTUtils.checkToken(token, username, Constants.UserRole.ADMIN)) {
22301102f69709e2025-06-08 14:10:02 +0800169 ans.put("message", "Invalid token");
22301102aadb0ac2025-06-05 18:02:21 +0800170 return ResponseEntity.badRequest().body(ans);
22301102aa5adbc2025-05-18 17:51:55 +0800171 }
172
173 User user = userService.findByUsername(targetUsername);
174 if (user != null) {
175 userService.deleteById(user.getUid());
22301102f69709e2025-06-08 14:10:02 +0800176 ans.put("message", "User deleted successfully");
22301102aadb0ac2025-06-05 18:02:21 +0800177 return ResponseEntity.ok(ans);
22301102aa5adbc2025-05-18 17:51:55 +0800178 } else {
22301102f69709e2025-06-08 14:10:02 +0800179 ans.put("message", "User not found");
22301102aadb0ac2025-06-05 18:02:21 +0800180 return ResponseEntity.badRequest().body(ans);
22301102aa5adbc2025-05-18 17:51:55 +0800181 }
182 }
183
184 @GetMapping("/list")
185 public ResponseEntity<?> listUsers(@RequestHeader("token") String token,
22301102f69709e2025-06-08 14:10:02 +0800186 @RequestBody Map<String, String> request) {
187 String username = request.get("username");
22301102aa5adbc2025-05-18 17:51:55 +0800188 if(!JWTUtils.checkToken(token, username, Constants.UserRole.ADMIN)) {
189 return ResponseEntity.badRequest().body("Invalid token");
190 }
191
192 Map<String, Object> ans = new HashMap<>();
22301102f69709e2025-06-08 14:10:02 +0800193 ans.put("message", "User list retrieved successfully");
22301102aadb0ac2025-06-05 18:02:21 +0800194 ans.put("data", Map.of(
195 "amount", userService.listAll().size(),
196 "users", userService.listAll()
197 ));
22301102aa5adbc2025-05-18 17:51:55 +0800198 return ResponseEntity.ok(ans);
199 }
200
201 @GetMapping("/get/info")
202 public ResponseEntity<?> getUserInfo(@RequestHeader("token") String token,
203 @RequestParam("username") String username) {
22301102f69709e2025-06-08 14:10:02 +0800204
22301102aadb0ac2025-06-05 18:02:21 +0800205 Map<String, Object> ans = new HashMap<>();
22301102aa5adbc2025-05-18 17:51:55 +0800206 if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)) {
22301102f69709e2025-06-08 14:10:02 +0800207 ans.put("message", "Invalid token");
22301102aadb0ac2025-06-05 18:02:21 +0800208 return ResponseEntity.badRequest().body(ans);
22301102aa5adbc2025-05-18 17:51:55 +0800209 }
210
211 User user = userService.findByUsername(username);
212 if (user != null) {
22301102f69709e2025-06-08 14:10:02 +0800213 ans.put("message", "User info retrieved successfully");
22301102aadb0ac2025-06-05 18:02:21 +0800214 ans.put("data", user);
22301102aa5adbc2025-05-18 17:51:55 +0800215 return ResponseEntity.ok(ans);
216 } else {
22301102f69709e2025-06-08 14:10:02 +0800217 ans.put("message", "User not found");
22301102aadb0ac2025-06-05 18:02:21 +0800218 return ResponseEntity.badRequest().body(ans);
22301102aa5adbc2025-05-18 17:51:55 +0800219 }
220 }
22301102e0c7c6e2025-05-17 11:08:45 +0800221}