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") @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) { public ResponseEntity<Map<String, Object>> updateUser(@Valid @RequestBody UpdateUserRequest request) {
try { try {
User user = userService.updateUser( User user = userService.updateUser(
request.getFcmToken(), request.getFcmToken(),
request.getDisplayName(), request.getDisplayName(),
request.getAvatar(), 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) { } 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 avatar;
private String username;
@Size(min = 6, message = "Password must be at least 8 characters long") @Size(min = 6, message = "Password must be at least 8 characters long")
private String password; private String password;
@ -46,4 +48,12 @@ public class UpdateUserRequest {
public void setPassword(String password) { public void setPassword(String password) {
this.password = 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); 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(); User user = getCurrentUser();
boolean wasNotActivated = !user.isActivated();
if (fcmToken != null && !fcmToken.trim().isEmpty()) { if (fcmToken != null && !fcmToken.trim().isEmpty()) {
user.setFcmToken(fcmToken); user.setFcmToken(fcmToken);
@ -75,6 +76,23 @@ public class UserService {
user.setPassword(passwordEncoder.encode(password)); 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;
} }
} }