centralize StringUtils usage

This commit is contained in:
2026-04-17 16:15:00 -06:00
parent 9fc51c511d
commit 47fcf082d6
10 changed files with 32 additions and 57 deletions

View File

@@ -25,7 +25,6 @@ import com.petshop.backend.service.EmailService;
import com.petshop.backend.service.PasswordResetService;
import com.petshop.backend.util.AuthenticationHelper;
import com.petshop.backend.util.ImageValidationUtil;
import com.petshop.backend.util.PhoneUtils;
import com.petshop.backend.util.StringUtils;
import jakarta.validation.Valid;
import org.springframework.core.io.Resource;
@@ -84,7 +83,7 @@ public class AuthController {
String email = StringUtils.trimToNull(request.getEmail());
String firstName = StringUtils.trimToNull(request.getFirstName());
String lastName = StringUtils.trimToNull(request.getLastName());
String phone = normalizePhone(request.getPhone());
String phone = StringUtils.normalizePhone(request.getPhone());
if (userRepository.findByUsername(username).isPresent()) {
log.warn("Registration rejected: username already exists ({})", username);
@@ -107,7 +106,7 @@ public class AuthController {
user.setEmail(email);
user.setFirstName(firstName);
user.setLastName(lastName);
user.setFullName(joinFullName(firstName, lastName));
user.setFullName(StringUtils.fullName(firstName, lastName));
user.setPhone(phone);
user.setRole(User.Role.CUSTOMER);
user.setActive(true);
@@ -219,11 +218,11 @@ public class AuthController {
user.setLastName(lastName);
}
if (firstName != null || lastName != null) {
user.setFullName(joinFullName(user.getFirstName(), user.getLastName()));
user.setFullName(StringUtils.fullName(user.getFirstName(), user.getLastName()));
}
if (request.getPhone() != null) {
String phone = normalizePhone(request.getPhone());
String phone = StringUtils.normalizePhone(request.getPhone());
if (!java.util.Objects.equals(phone, user.getPhone())) {
if (phone != null && userRepository.findByPhone(phone)
.filter(existing -> !existing.getId().equals(user.getId()))
@@ -258,7 +257,7 @@ public class AuthController {
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());
fullName = StringUtils.fullName(user.getFirstName(), user.getLastName());
}
return new UserInfoResponse(
user.getId(),
@@ -277,22 +276,6 @@ public class AuthController {
);
}
private String normalizePhone(String value) {
return StringUtils.trimToNull(PhoneUtils.normalize(StringUtils.trimToNull(value)));
}
private String joinFullName(String firstName, String lastName) {
String first = StringUtils.trimToNull(firstName);
String last = StringUtils.trimToNull(lastName);
if (first == null) {
return last == null ? null : last;
}
if (last == null) {
return first;
}
return first + " " + last;
}
@PostMapping("/me/avatar")
public ResponseEntity<AvatarUploadResponse> uploadAvatar(@RequestParam("avatar") MultipartFile file) {
User user = getAuthenticatedUser();

View File

@@ -3,6 +3,7 @@ package com.petshop.backend.controller;
import com.petshop.backend.dto.common.DropdownOption;
import com.petshop.backend.entity.User;
import com.petshop.backend.repository.*;
import com.petshop.backend.util.StringUtils;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
@@ -68,7 +69,7 @@ public class DropdownController {
public ResponseEntity<List<DropdownOption>> getCustomers() {
return ResponseEntity.ok(
userRepository.findByRoleAndActiveTrue(User.Role.CUSTOMER).stream()
.map(u -> new DropdownOption(u.getId(), u.getFirstName() + " " + u.getLastName()))
.map(u -> new DropdownOption(u.getId(), StringUtils.fullName(u.getFirstName(), u.getLastName())))
.sorted(Comparator.comparing(DropdownOption::getLabel, String.CASE_INSENSITIVE_ORDER))
.collect(Collectors.toList())
);
@@ -90,7 +91,7 @@ public class DropdownController {
return ResponseEntity.ok(
userRepository.findByRoleAndActiveTrue(User.Role.CUSTOMER).stream()
.filter(u -> customersWithPets.contains(u.getId()))
.map(u -> new DropdownOption(u.getId(), u.getFirstName() + " " + u.getLastName()))
.map(u -> new DropdownOption(u.getId(), StringUtils.fullName(u.getFirstName(), u.getLastName())))
.sorted(Comparator.comparing(DropdownOption::getLabel, String.CASE_INSENSITIVE_ORDER))
.collect(Collectors.toList())
);
@@ -190,7 +191,7 @@ public class DropdownController {
}
return ResponseEntity.ok(
employees.stream()
.map(u -> new DropdownOption(u.getId(), u.getFirstName() + " " + u.getLastName()))
.map(u -> new DropdownOption(u.getId(), StringUtils.fullName(u.getFirstName(), u.getLastName())))
.sorted(Comparator.comparing(DropdownOption::getLabel, String.CASE_INSENSITIVE_ORDER))
.collect(Collectors.toList())
);

View File

@@ -6,6 +6,7 @@ import com.petshop.backend.entity.StoreLocation;
import com.petshop.backend.entity.User;
import com.petshop.backend.repository.ActivityLogRepository;
import com.petshop.backend.repository.UserRepository;
import com.petshop.backend.util.StringUtils;
import jakarta.persistence.criteria.Predicate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -48,7 +49,10 @@ public class ActivityLogService {
entry.setUser(managedUser);
entry.setStore(store);
entry.setUsernameSnapshot(managedUser.getUsername());
entry.setFullNameSnapshot(resolveFullName(managedUser));
String fullName = managedUser.getFullName() != null && !managedUser.getFullName().isBlank()
? managedUser.getFullName()
: StringUtils.fullName(managedUser.getFirstName(), managedUser.getLastName());
entry.setFullNameSnapshot(fullName);
entry.setRoleSnapshot(managedUser.getRole() != null ? managedUser.getRole().name() : null);
entry.setStoreNameSnapshot(store != null ? store.getStoreName() : null);
entry.setActivity(activity.trim());
@@ -127,7 +131,10 @@ public class ActivityLogService {
if (entry.getUser() != null) {
response.setUserId(entry.getUser().getId());
response.setUsername(firstNonBlank(entry.getUsernameSnapshot(), entry.getUser().getUsername()));
response.setFullName(firstNonBlank(entry.getFullNameSnapshot(), resolveFullName(entry.getUser())));
String liveName = entry.getUser().getFullName() != null && !entry.getUser().getFullName().isBlank()
? entry.getUser().getFullName()
: StringUtils.fullName(entry.getUser().getFirstName(), entry.getUser().getLastName());
response.setFullName(firstNonBlank(entry.getFullNameSnapshot(), liveName));
response.setRole(firstNonBlank(entry.getRoleSnapshot(), entry.getUser().getRole() != null ? entry.getUser().getRole().name() : null));
}
@@ -147,24 +154,6 @@ public class ActivityLogService {
return response;
}
private String resolveFullName(User user) {
if (user == null) {
return null;
}
if (user.getFullName() != null && !user.getFullName().isBlank()) {
return user.getFullName();
}
String first = user.getFirstName();
String last = user.getLastName();
if (first == null || first.isBlank()) {
return last;
}
if (last == null || last.isBlank()) {
return first;
}
return first.trim() + " " + last.trim();
}
private String firstNonBlank(String preferred, String fallback) {
if (preferred != null && !preferred.isBlank()) {
return preferred;

View File

@@ -256,9 +256,9 @@ public class AdoptionService {
adoption.getPet().getPetId(),
adoption.getPet().getPetName(),
adoption.getCustomer().getId(),
adoption.getCustomer().getFirstName() + " " + adoption.getCustomer().getLastName(),
StringUtils.fullName(adoption.getCustomer().getFirstName(), adoption.getCustomer().getLastName()),
adoption.getEmployee().getId(),
adoption.getEmployee().getFirstName() + " " + adoption.getEmployee().getLastName(),
StringUtils.fullName(adoption.getEmployee().getFirstName(), adoption.getEmployee().getLastName()),
sourceStore != null ? sourceStore.getStoreId() : null,
sourceStore != null ? sourceStore.getStoreName() : null,
adoption.getAdoptionDate(),

View File

@@ -8,6 +8,7 @@ import com.petshop.backend.entity.User;
import com.petshop.backend.repository.InventoryRepository;
import com.petshop.backend.repository.ProductRepository;
import com.petshop.backend.repository.SaleRepository;
import com.petshop.backend.util.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -181,12 +182,12 @@ public class AnalyticsService {
if (sale.getIsRefund()) {
continue;
}
String employeeName = sale.getEmployee().getFirstName() + " " + sale.getEmployee().getLastName();
String employeeName = StringUtils.fullName(sale.getEmployee().getFirstName(), sale.getEmployee().getLastName());
employeeRevenue.merge(employeeName, sale.getTotalAmount(), BigDecimal::add);
}
if (user.getRole() == User.Role.STAFF && employeeRevenue.isEmpty()) {
String employeeName = user.getFirstName() + " " + user.getLastName();
String employeeName = StringUtils.fullName(user.getFirstName(), user.getLastName());
employeeRevenue.put(employeeName, BigDecimal.ZERO);
}

View File

@@ -324,7 +324,7 @@ public class AppointmentService {
response.setAppointmentId(appointment.getAppointmentId());
if (appointment.getCustomer() != null) {
response.setCustomerId(appointment.getCustomer().getId());
response.setCustomerName(appointment.getCustomer().getFirstName() + " " + appointment.getCustomer().getLastName());
response.setCustomerName(StringUtils.fullName(appointment.getCustomer().getFirstName(), appointment.getCustomer().getLastName()));
}
if (appointment.getStore() != null) {
response.setStoreId(appointment.getStore().getStoreId());
@@ -339,7 +339,7 @@ public class AppointmentService {
response.setAppointmentStatus(appointment.getAppointmentStatus());
if (appointment.getEmployee() != null) {
response.setEmployeeId(appointment.getEmployee().getId());
response.setEmployeeName(appointment.getEmployee().getFirstName() + " " + appointment.getEmployee().getLastName());
response.setEmployeeName(StringUtils.fullName(appointment.getEmployee().getFirstName(), appointment.getEmployee().getLastName()));
}
response.setPetName(pet != null ? pet.getPetName() : null);
response.setPetId(pet != null ? pet.getPetId() : null);

View File

@@ -7,6 +7,7 @@ import com.petshop.backend.entity.Message;
import com.petshop.backend.entity.Sale;
import com.petshop.backend.entity.SaleItem;
import com.petshop.backend.entity.User;
import com.petshop.backend.util.StringUtils;
import com.resend.Resend;
import com.resend.services.emails.model.CreateEmailOptions;
import org.slf4j.Logger;
@@ -246,7 +247,7 @@ public class EmailService {
String date = appointment.getAppointmentDate() != null ? appointment.getAppointmentDate().format(DATE_FMT) : "";
String time = appointment.getAppointmentTime() != null ? appointment.getAppointmentTime().format(TIME_FMT) : "";
String employee = appointment.getEmployee() != null
? appointment.getEmployee().getFirstName() + " " + appointment.getEmployee().getLastName() : "";
? StringUtils.fullName(appointment.getEmployee().getFirstName(), appointment.getEmployee().getLastName()) : "";
String pet = appointment.getPet() != null ? appointment.getPet().getPetName() : null;
return """
<div style="font-family:sans-serif;max-width:600px;margin:auto">

View File

@@ -330,7 +330,7 @@ public class PetService {
pet.getCreatedAt(),
pet.getUpdatedAt(),
owner != null ? owner.getId() : null,
owner != null ? owner.getFirstName() + " " + owner.getLastName() : null,
owner != null ? StringUtils.fullName(owner.getFirstName(), owner.getLastName()) : null,
store != null ? store.getStoreId() : null,
store != null ? store.getStoreName() : null
);

View File

@@ -334,7 +334,7 @@ public class SaleService {
if (sale.getEmployee() != null) {
response.setEmployeeId(sale.getEmployee().getId());
response.setEmployeeName(sale.getEmployee().getFirstName() + " " + sale.getEmployee().getLastName());
response.setEmployeeName(StringUtils.fullName(sale.getEmployee().getFirstName(), sale.getEmployee().getLastName()));
}
if (sale.getStore() != null) {
@@ -344,7 +344,7 @@ public class SaleService {
if (sale.getCustomer() != null) {
response.setCustomerId(sale.getCustomer().getId());
response.setCustomerName(sale.getCustomer().getFirstName() + " " + sale.getCustomer().getLastName());
response.setCustomerName(StringUtils.fullName(sale.getCustomer().getFirstName(), sale.getCustomer().getLastName()));
}
response.setTotalAmount(sale.getTotalAmount());

View File

@@ -90,7 +90,7 @@ public class UserService {
user.setLastName(request.getLastName());
user.setFullName(request.getFullName());
user.setEmail(request.getEmail());
user.setPhone(StringUtils.trimToNull(request.getPhone()));
user.setPhone(StringUtils.normalizePhone(request.getPhone()));
user.setRole(request.getRole());
user.setStaffRole(StringUtils.trimToNull(request.getStaffRole()));
user.setPrimaryStore(resolveStore(request.getPrimaryStoreId()));
@@ -134,7 +134,7 @@ public class UserService {
user.setLastName(request.getLastName());
user.setFullName(request.getFullName());
user.setEmail(request.getEmail());
String phone = StringUtils.trimToNull(request.getPhone());
String phone = StringUtils.normalizePhone(request.getPhone());
if (!Objects.equals(user.getPhone(), phone)) {
validateUniquePhone(phone, user.getId());
}