fix web registration

This commit is contained in:
2026-04-07 09:10:11 -06:00
parent 0655dfdfea
commit ee2cab953d

View File

@@ -13,6 +13,7 @@ import com.petshop.backend.repository.UserRepository;
import com.petshop.backend.security.JwtUtil; import com.petshop.backend.security.JwtUtil;
import com.petshop.backend.service.AvatarStorageService; import com.petshop.backend.service.AvatarStorageService;
import com.petshop.backend.util.AuthenticationHelper; import com.petshop.backend.util.AuthenticationHelper;
import com.petshop.backend.util.PhoneUtils;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
@@ -53,19 +54,23 @@ public class AuthController {
@PostMapping("/register") @PostMapping("/register")
public ResponseEntity<?> register(@Valid @RequestBody RegisterRequest request) { public ResponseEntity<?> register(@Valid @RequestBody RegisterRequest request) {
if (userRepository.findByUsername(request.getUsername()).isPresent()) { String username = trimToNull(request.getUsername());
String email = trimToNull(request.getEmail());
NameParts nameParts = splitFullName(request.getFullName());
String phone = normalizePhone(request.getPhone());
if (userRepository.findByUsername(username).isPresent()) {
Map<String, String> error = new HashMap<>(); Map<String, String> error = new HashMap<>();
error.put("message", "Username already exists"); error.put("message", "Username already exists");
return ResponseEntity.status(HttpStatus.CONFLICT).body(error); return ResponseEntity.status(HttpStatus.CONFLICT).body(error);
} }
if (userRepository.findByEmail(request.getEmail()).isPresent()) { if (userRepository.findByEmail(email).isPresent()) {
Map<String, String> error = new HashMap<>(); Map<String, String> error = new HashMap<>();
error.put("message", "Email already exists"); error.put("message", "Email already exists");
return ResponseEntity.status(HttpStatus.CONFLICT).body(error); return ResponseEntity.status(HttpStatus.CONFLICT).body(error);
} }
String phone = trimToNull(request.getPhone());
if (phone != null && userRepository.findByPhone(phone).isPresent()) { if (phone != null && userRepository.findByPhone(phone).isPresent()) {
Map<String, String> error = new HashMap<>(); Map<String, String> error = new HashMap<>();
error.put("message", "Phone already exists"); error.put("message", "Phone already exists");
@@ -73,10 +78,12 @@ public class AuthController {
} }
User user = new User(); User user = new User();
user.setUsername(request.getUsername()); user.setUsername(username);
user.setPassword(passwordEncoder.encode(request.getPassword())); user.setPassword(passwordEncoder.encode(request.getPassword()));
user.setEmail(request.getEmail()); user.setEmail(email);
user.setFullName(request.getFullName()); user.setFirstName(nameParts.firstName());
user.setLastName(nameParts.lastName());
user.setFullName(nameParts.fullName());
user.setPhone(phone); user.setPhone(phone);
user.setRole(User.Role.CUSTOMER); user.setRole(User.Role.CUSTOMER);
user.setActive(true); user.setActive(true);
@@ -143,31 +150,36 @@ public class AuthController {
User user = getAuthenticatedUser(); User user = getAuthenticatedUser();
boolean invalidateToken = false; boolean invalidateToken = false;
if (request.getUsername() != null && !request.getUsername().equals(user.getUsername())) { String username = trimToNull(request.getUsername());
if (userRepository.findByUsername(request.getUsername()).isPresent()) { if (username != null && !username.equals(user.getUsername())) {
if (userRepository.findByUsername(username).isPresent()) {
Map<String, String> error = new HashMap<>(); Map<String, String> error = new HashMap<>();
error.put("message", "Username already exists"); error.put("message", "Username already exists");
return ResponseEntity.status(HttpStatus.CONFLICT).body(error); return ResponseEntity.status(HttpStatus.CONFLICT).body(error);
} }
user.setUsername(request.getUsername()); user.setUsername(username);
invalidateToken = true; invalidateToken = true;
} }
if (request.getEmail() != null && !request.getEmail().equals(user.getEmail())) { String email = trimToNull(request.getEmail());
if (userRepository.findByEmail(request.getEmail()).isPresent()) { if (email != null && !email.equals(user.getEmail())) {
if (userRepository.findByEmail(email).isPresent()) {
Map<String, String> error = new HashMap<>(); Map<String, String> error = new HashMap<>();
error.put("message", "Email already exists"); error.put("message", "Email already exists");
return ResponseEntity.status(HttpStatus.CONFLICT).body(error); return ResponseEntity.status(HttpStatus.CONFLICT).body(error);
} }
user.setEmail(request.getEmail()); user.setEmail(email);
} }
if (request.getFullName() != null) { if (request.getFullName() != null) {
user.setFullName(request.getFullName()); NameParts nameParts = splitFullName(request.getFullName());
user.setFirstName(nameParts.firstName());
user.setLastName(nameParts.lastName());
user.setFullName(nameParts.fullName());
} }
if (request.getPhone() != null) { if (request.getPhone() != null) {
String phone = trimToNull(request.getPhone()); String phone = normalizePhone(request.getPhone());
if (!java.util.Objects.equals(phone, user.getPhone())) { if (!java.util.Objects.equals(phone, user.getPhone())) {
if (phone != null && userRepository.findByPhone(phone) if (phone != null && userRepository.findByPhone(phone)
.filter(existing -> !existing.getId().equals(user.getId())) .filter(existing -> !existing.getId().equals(user.getId()))
@@ -196,11 +208,15 @@ public class AuthController {
private UserInfoResponse toUserInfoResponse(User user) { private UserInfoResponse toUserInfoResponse(User user) {
StoreLocation primaryStore = user.getPrimaryStore(); StoreLocation primaryStore = user.getPrimaryStore();
Long customerId = user.getRole() == User.Role.CUSTOMER ? user.getId() : null; Long customerId = user.getRole() == User.Role.CUSTOMER ? user.getId() : null;
String fullName = user.getFullName();
if (fullName == null || fullName.isBlank()) {
fullName = joinFullName(user.getFirstName(), user.getLastName());
}
return new UserInfoResponse( return new UserInfoResponse(
user.getId(), user.getId(),
user.getUsername(), user.getUsername(),
user.getEmail(), user.getEmail(),
user.getFullName(), fullName,
user.getPhone(), user.getPhone(),
avatarStorageService.toOwnerAvatarUrl(user), avatarStorageService.toOwnerAvatarUrl(user),
user.getRole().name(), user.getRole().name(),
@@ -218,6 +234,36 @@ public class AuthController {
return trimmed.isEmpty() ? null : trimmed; return trimmed.isEmpty() ? null : trimmed;
} }
private String normalizePhone(String value) {
return trimToNull(PhoneUtils.normalize(trimToNull(value)));
}
private NameParts splitFullName(String value) {
String normalized = trimToNull(value);
if (normalized == null) {
throw new IllegalArgumentException("Full name is required");
}
String[] parts = normalized.split("\\s+", 2);
String firstName = parts[0];
String lastName = parts.length > 1 ? parts[1] : "";
return new NameParts(firstName, lastName, joinFullName(firstName, lastName));
}
private String joinFullName(String firstName, String lastName) {
String first = trimToNull(firstName);
String last = trimToNull(lastName);
if (first == null) {
return last == null ? null : last;
}
if (last == null) {
return first;
}
return first + " " + last;
}
private record NameParts(String firstName, String lastName, String fullName) {
}
@PostMapping("/me/avatar") @PostMapping("/me/avatar")
public ResponseEntity<?> uploadAvatar(@RequestParam("avatar") MultipartFile file) { public ResponseEntity<?> uploadAvatar(@RequestParam("avatar") MultipartFile file) {
User user = getAuthenticatedUser(); User user = getAuthenticatedUser();