feat: implement /updateUser endpoint in backend

This commit is contained in:
sBubshait 2025-07-29 09:22:40 +03:00
parent 8bc1c7bab1
commit 7c2298df35
3 changed files with 55 additions and 6 deletions

View File

@ -69,18 +69,39 @@ public class AuthController {
}
@PostMapping("/updateUser")
@Operation(summary = "Update user information", description = "Update authenticated user's fcmToken, displayName, avatar, or password")
@Operation(summary = "Update user information", description = "Update authenticated user's fcmToken, displayName, avatar, password, or username")
public ResponseEntity<Map<String, Object>> updateUser(@Valid @RequestBody UpdateUserRequest request) {
try {
User user = userService.updateUser(
request.getFcmToken(),
request.getDisplayName(),
request.getAvatar(),
request.getPassword()
request.getPassword(),
request.getUsername()
);
return ResponseEntity.ok(Map.of("status", 200, "user", user));
// Create user data without password
Map<String, Object> userData = Map.of(
"id", user.getId(),
"email", user.getEmail(),
"username", user.getUsername() != null ? user.getUsername() : "",
"displayName", user.getDisplayName(),
"avatar", user.getAvatar() != null ? user.getAvatar() : "",
"fcmToken", user.getFcmToken() != null ? user.getFcmToken() : "",
"activated", user.isActivated(),
"role", user.getRole()
);
return ResponseEntity.ok(Map.of(
"status", true,
"message", "Profile updated successfully",
"data", userData
));
} catch (RuntimeException e) {
return ResponseEntity.badRequest().body(Map.of("status", 400, "message", e.getMessage()));
return ResponseEntity.ok(Map.of(
"status", false,
"message", e.getMessage()
));
}
}

View File

@ -10,6 +10,8 @@ public class UpdateUserRequest {
private String avatar;
private String username;
@Size(min = 6, message = "Password must be at least 8 characters long")
private String password;
@ -46,4 +48,12 @@ public class UpdateUserRequest {
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}

View File

@ -56,8 +56,9 @@ public class UserService {
return userRepository.save(user);
}
public User updateUser(String fcmToken, String displayName, String avatar, String password) {
public User updateUser(String fcmToken, String displayName, String avatar, String password, String username) {
User user = getCurrentUser();
boolean wasNotActivated = !user.isActivated();
if (fcmToken != null && !fcmToken.trim().isEmpty()) {
user.setFcmToken(fcmToken);
@ -75,6 +76,23 @@ public class UserService {
user.setPassword(passwordEncoder.encode(password));
}
return userRepository.save(user);
if (username != null && !username.trim().isEmpty()) {
// Check if username is different from current username to avoid false positives
if (!username.equals(user.getUsername()) && userRepository.existsByUsername(username)) {
System.out.println("Username taken!");
throw new RuntimeException("@" + username + " is already taken. Try another username");
}
System.out.println("It still happened here");
user.setUsername(username);
}
User savedUser = userRepository.save(user);
if (wasNotActivated) {
savedUser.setActivated(true);
savedUser = userRepository.save(savedUser);
}
return savedUser;
}
}