blob: 3bb05c556120b33375cb49132fedcd0cd494bdc1 [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");
22301102039b52a2025-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(),
86 "points", user.getPoints()
87 ));
2230110210198562025-05-17 16:27:12 +080088 return ResponseEntity.ok().body(ans);
22301102e0c7c6e2025-05-17 11:08:45 +080089 } else {
22301102f69709e2025-06-08 14:10:02 +080090 ans.put("message", "Invalid username or password");
2230110210198562025-05-17 16:27:12 +080091 return ResponseEntity.badRequest().body(ans);
22301102e0c7c6e2025-05-17 11:08:45 +080092 }
93 }
94
95 @PostMapping("/update/username")
2230110210198562025-05-17 16:27:12 +080096 public ResponseEntity<?> updateUsername(@RequestHeader("token") String token,
22301102f69709e2025-06-08 14:10:02 +080097 @RequestBody Map<String, String> request) {
98 String oldUsername = request.get("username");
99 String newUsername = request.get("newUsername");
100
22301102aadb0ac2025-06-05 18:02:21 +0800101 Map<String, Object> ans = new HashMap<>();
2230110210198562025-05-17 16:27:12 +0800102 if(!JWTUtils.checkToken(token, oldUsername, Constants.UserRole.USER)) {
22301102f69709e2025-06-08 14:10:02 +0800103 ans.put("message", "Invalid token");
22301102aadb0ac2025-06-05 18:02:21 +0800104 return ResponseEntity.badRequest().body(ans);
2230110210198562025-05-17 16:27:12 +0800105 }
106
22301102e0c7c6e2025-05-17 11:08:45 +0800107 User user = userService.findByUsername(oldUsername);
108 if (user != null) {
109 user.setUsername(newUsername);
110 userService.save(user);
22301102f69709e2025-06-08 14:10:02 +0800111 ans.put("message", "Username updated successfully");
22301102aadb0ac2025-06-05 18:02:21 +0800112 return ResponseEntity.ok(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800113 } else {
22301102f69709e2025-06-08 14:10:02 +0800114 ans.put("message", "User not found");
22301102aadb0ac2025-06-05 18:02:21 +0800115 return ResponseEntity.badRequest().body(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800116 }
117 }
118
119 @PostMapping("/update/password")
2230110210198562025-05-17 16:27:12 +0800120 public ResponseEntity<?> updatePassword(@RequestHeader("token") String token,
22301102f69709e2025-06-08 14:10:02 +0800121 @RequestBody Map<String, String> request
122 ) {
123 String username = request.get("username");
124 String newPassword = request.get("newPassword");
125
22301102aadb0ac2025-06-05 18:02:21 +0800126 Map<String, Object> ans = new HashMap<>();
2230110210198562025-05-17 16:27:12 +0800127 if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)) {
22301102f69709e2025-06-08 14:10:02 +0800128 ans.put("message", "Invalid token");
22301102aadb0ac2025-06-05 18:02:21 +0800129 return ResponseEntity.badRequest().body(ans);
2230110210198562025-05-17 16:27:12 +0800130 }
131
22301102e0c7c6e2025-05-17 11:08:45 +0800132 User user = userService.findByUsername(username);
133 if (user != null) {
134 user.setPassword(newPassword);
135 userService.save(user);
22301102f69709e2025-06-08 14:10:02 +0800136 ans.put("message", "Password updated successfully");
22301102aadb0ac2025-06-05 18:02:21 +0800137 return ResponseEntity.ok(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800138 } else {
22301102f69709e2025-06-08 14:10:02 +0800139 ans.put("message", "Invalid username or password");
22301102aadb0ac2025-06-05 18:02:21 +0800140 return ResponseEntity.badRequest().body(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800141 }
142 }
143
144 @PostMapping("/update/email")
2230110210198562025-05-17 16:27:12 +0800145 public ResponseEntity<?> updateEmail(@RequestHeader("token") String token,
22301102f69709e2025-06-08 14:10:02 +0800146 @RequestBody Map<String, String> request) {
147 String username = request.get("username");
148 String newEmail = request.get("newEmail");
22301102aadb0ac2025-06-05 18:02:21 +0800149
150 Map<String, Object> ans = new HashMap<>();
2230110210198562025-05-17 16:27:12 +0800151 if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)) {
22301102f69709e2025-06-08 14:10:02 +0800152 ans.put("message", "Invalid token");
22301102aadb0ac2025-06-05 18:02:21 +0800153 return ResponseEntity.badRequest().body(ans);
2230110210198562025-05-17 16:27:12 +0800154 }
155
22301102e0c7c6e2025-05-17 11:08:45 +0800156 User user = userService.findByUsername(username);
157 if (user != null) {
158 user.setEmail(newEmail);
159 userService.save(user);
22301102f69709e2025-06-08 14:10:02 +0800160 ans.put("message", "Email updated successfully");
22301102aadb0ac2025-06-05 18:02:21 +0800161 return ResponseEntity.ok(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800162 } else {
22301102f69709e2025-06-08 14:10:02 +0800163 ans.put("message", "User not found");
22301102aadb0ac2025-06-05 18:02:21 +0800164 return ResponseEntity.badRequest().body(ans);
22301102e0c7c6e2025-05-17 11:08:45 +0800165 }
166 }
22301102aa5adbc2025-05-18 17:51:55 +0800167
168 @DeleteMapping("/delete")
169 public ResponseEntity<?> deleteUser(@RequestHeader("token") String token,
22301102039b52a2025-06-08 14:10:02 +0800170 @RequestParam("username") String username,
171 @RequestParam("targetUsername") String targetUsername) {
22301102f69709e2025-06-08 14:10:02 +0800172
22301102aadb0ac2025-06-05 18:02:21 +0800173 Map<String, Object> ans = new HashMap<>();
22301102aa5adbc2025-05-18 17:51:55 +0800174 if(!JWTUtils.checkToken(token, username, Constants.UserRole.ADMIN)) {
22301102f69709e2025-06-08 14:10:02 +0800175 ans.put("message", "Invalid token");
22301102aadb0ac2025-06-05 18:02:21 +0800176 return ResponseEntity.badRequest().body(ans);
22301102aa5adbc2025-05-18 17:51:55 +0800177 }
178
179 User user = userService.findByUsername(targetUsername);
180 if (user != null) {
181 userService.deleteById(user.getUid());
22301102f69709e2025-06-08 14:10:02 +0800182 ans.put("message", "User deleted successfully");
22301102aadb0ac2025-06-05 18:02:21 +0800183 return ResponseEntity.ok(ans);
22301102aa5adbc2025-05-18 17:51:55 +0800184 } else {
22301102f69709e2025-06-08 14:10:02 +0800185 ans.put("message", "User not found");
22301102aadb0ac2025-06-05 18:02:21 +0800186 return ResponseEntity.badRequest().body(ans);
22301102aa5adbc2025-05-18 17:51:55 +0800187 }
188 }
189
190 @GetMapping("/list")
191 public ResponseEntity<?> listUsers(@RequestHeader("token") String token,
22301102039b52a2025-06-08 14:10:02 +0800192 @RequestParam("username") String username) {
22301102aa5adbc2025-05-18 17:51:55 +0800193 if(!JWTUtils.checkToken(token, username, Constants.UserRole.ADMIN)) {
194 return ResponseEntity.badRequest().body("Invalid token");
195 }
196
197 Map<String, Object> ans = new HashMap<>();
22301102f69709e2025-06-08 14:10:02 +0800198 ans.put("message", "User list retrieved successfully");
22301102aadb0ac2025-06-05 18:02:21 +0800199 ans.put("data", Map.of(
200 "amount", userService.listAll().size(),
201 "users", userService.listAll()
202 ));
22301102aa5adbc2025-05-18 17:51:55 +0800203 return ResponseEntity.ok(ans);
204 }
205
206 @GetMapping("/get/info")
207 public ResponseEntity<?> getUserInfo(@RequestHeader("token") String token,
208 @RequestParam("username") String username) {
22301102f69709e2025-06-08 14:10:02 +0800209
22301102aadb0ac2025-06-05 18:02:21 +0800210 Map<String, Object> ans = new HashMap<>();
22301102039b52a2025-06-08 14:10:02 +0800211 System.out.println("Enter user info ");
22301102aa5adbc2025-05-18 17:51:55 +0800212 if(!JWTUtils.checkToken(token, username, Constants.UserRole.USER)) {
22301102f69709e2025-06-08 14:10:02 +0800213 ans.put("message", "Invalid token");
22301102039b52a2025-06-08 14:10:02 +0800214 System.out.println("Invalid token");
22301102aadb0ac2025-06-05 18:02:21 +0800215 return ResponseEntity.badRequest().body(ans);
22301102aa5adbc2025-05-18 17:51:55 +0800216 }
217
218 User user = userService.findByUsername(username);
219 if (user != null) {
22301102f69709e2025-06-08 14:10:02 +0800220 ans.put("message", "User info retrieved successfully");
22301102aadb0ac2025-06-05 18:02:21 +0800221 ans.put("data", user);
22301102039b52a2025-06-08 14:10:02 +0800222 System.out.println("User info retrieved successfully");
22301102aa5adbc2025-05-18 17:51:55 +0800223 return ResponseEntity.ok(ans);
224 } else {
22301102f69709e2025-06-08 14:10:02 +0800225 ans.put("message", "User not found");
22301102039b52a2025-06-08 14:10:02 +0800226 System.out.println("User not found");
22301102aadb0ac2025-06-05 18:02:21 +0800227 return ResponseEntity.badRequest().body(ans);
22301102aa5adbc2025-05-18 17:51:55 +0800228 }
229 }
22301102e0c7c6e2025-05-17 11:08:45 +0800230}