diff --git a/backend/src/main/java/com/petshop/backend/controller/AuthController.java b/backend/src/main/java/com/petshop/backend/controller/AuthController.java index c237f27e..ec4f822b 100644 --- a/backend/src/main/java/com/petshop/backend/controller/AuthController.java +++ b/backend/src/main/java/com/petshop/backend/controller/AuthController.java @@ -13,6 +13,7 @@ import com.petshop.backend.repository.UserRepository; import com.petshop.backend.security.JwtUtil; import com.petshop.backend.service.AvatarStorageService; import com.petshop.backend.util.AuthenticationHelper; +import com.petshop.backend.util.PhoneUtils; import jakarta.validation.Valid; import org.springframework.core.io.Resource; import org.springframework.http.HttpStatus; @@ -53,19 +54,23 @@ public class AuthController { @PostMapping("/register") 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 error = new HashMap<>(); error.put("message", "Username already exists"); return ResponseEntity.status(HttpStatus.CONFLICT).body(error); } - if (userRepository.findByEmail(request.getEmail()).isPresent()) { + if (userRepository.findByEmail(email).isPresent()) { Map error = new HashMap<>(); error.put("message", "Email already exists"); return ResponseEntity.status(HttpStatus.CONFLICT).body(error); } - String phone = trimToNull(request.getPhone()); if (phone != null && userRepository.findByPhone(phone).isPresent()) { Map error = new HashMap<>(); error.put("message", "Phone already exists"); @@ -73,10 +78,12 @@ public class AuthController { } User user = new User(); - user.setUsername(request.getUsername()); + user.setUsername(username); user.setPassword(passwordEncoder.encode(request.getPassword())); - user.setEmail(request.getEmail()); - user.setFullName(request.getFullName()); + user.setEmail(email); + user.setFirstName(nameParts.firstName()); + user.setLastName(nameParts.lastName()); + user.setFullName(nameParts.fullName()); user.setPhone(phone); user.setRole(User.Role.CUSTOMER); user.setActive(true); @@ -143,31 +150,36 @@ public class AuthController { User user = getAuthenticatedUser(); boolean invalidateToken = false; - if (request.getUsername() != null && !request.getUsername().equals(user.getUsername())) { - if (userRepository.findByUsername(request.getUsername()).isPresent()) { + String username = trimToNull(request.getUsername()); + if (username != null && !username.equals(user.getUsername())) { + if (userRepository.findByUsername(username).isPresent()) { Map error = new HashMap<>(); error.put("message", "Username already exists"); return ResponseEntity.status(HttpStatus.CONFLICT).body(error); } - user.setUsername(request.getUsername()); + user.setUsername(username); invalidateToken = true; } - if (request.getEmail() != null && !request.getEmail().equals(user.getEmail())) { - if (userRepository.findByEmail(request.getEmail()).isPresent()) { + String email = trimToNull(request.getEmail()); + if (email != null && !email.equals(user.getEmail())) { + if (userRepository.findByEmail(email).isPresent()) { Map error = new HashMap<>(); error.put("message", "Email already exists"); return ResponseEntity.status(HttpStatus.CONFLICT).body(error); } - user.setEmail(request.getEmail()); + user.setEmail(email); } 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) { - String phone = trimToNull(request.getPhone()); + String phone = normalizePhone(request.getPhone()); if (!java.util.Objects.equals(phone, user.getPhone())) { if (phone != null && userRepository.findByPhone(phone) .filter(existing -> !existing.getId().equals(user.getId())) @@ -196,11 +208,15 @@ public class AuthController { private UserInfoResponse toUserInfoResponse(User user) { StoreLocation primaryStore = user.getPrimaryStore(); 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( user.getId(), user.getUsername(), user.getEmail(), - user.getFullName(), + fullName, user.getPhone(), avatarStorageService.toOwnerAvatarUrl(user), user.getRole().name(), @@ -218,6 +234,36 @@ public class AuthController { 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") public ResponseEntity uploadAvatar(@RequestParam("avatar") MultipartFile file) { User user = getAuthenticatedUser();