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.service.PasswordResetService;
import com.petshop.backend.util.AuthenticationHelper; import com.petshop.backend.util.AuthenticationHelper;
import com.petshop.backend.util.ImageValidationUtil; import com.petshop.backend.util.ImageValidationUtil;
import com.petshop.backend.util.PhoneUtils;
import com.petshop.backend.util.StringUtils; import com.petshop.backend.util.StringUtils;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
@@ -84,7 +83,7 @@ public class AuthController {
String email = StringUtils.trimToNull(request.getEmail()); String email = StringUtils.trimToNull(request.getEmail());
String firstName = StringUtils.trimToNull(request.getFirstName()); String firstName = StringUtils.trimToNull(request.getFirstName());
String lastName = StringUtils.trimToNull(request.getLastName()); String lastName = StringUtils.trimToNull(request.getLastName());
String phone = normalizePhone(request.getPhone()); String phone = StringUtils.normalizePhone(request.getPhone());
if (userRepository.findByUsername(username).isPresent()) { if (userRepository.findByUsername(username).isPresent()) {
log.warn("Registration rejected: username already exists ({})", username); log.warn("Registration rejected: username already exists ({})", username);
@@ -107,7 +106,7 @@ public class AuthController {
user.setEmail(email); user.setEmail(email);
user.setFirstName(firstName); user.setFirstName(firstName);
user.setLastName(lastName); user.setLastName(lastName);
user.setFullName(joinFullName(firstName, lastName)); user.setFullName(StringUtils.fullName(firstName, lastName));
user.setPhone(phone); user.setPhone(phone);
user.setRole(User.Role.CUSTOMER); user.setRole(User.Role.CUSTOMER);
user.setActive(true); user.setActive(true);
@@ -219,11 +218,11 @@ public class AuthController {
user.setLastName(lastName); user.setLastName(lastName);
} }
if (firstName != null || lastName != null) { if (firstName != null || lastName != null) {
user.setFullName(joinFullName(user.getFirstName(), user.getLastName())); user.setFullName(StringUtils.fullName(user.getFirstName(), user.getLastName()));
} }
if (request.getPhone() != null) { if (request.getPhone() != null) {
String phone = normalizePhone(request.getPhone()); String phone = StringUtils.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()))
@@ -258,7 +257,7 @@ public class AuthController {
Long customerId = user.getRole() == User.Role.CUSTOMER ? user.getId() : null; Long customerId = user.getRole() == User.Role.CUSTOMER ? user.getId() : null;
String fullName = user.getFullName(); String fullName = user.getFullName();
if (fullName == null || fullName.isBlank()) { if (fullName == null || fullName.isBlank()) {
fullName = joinFullName(user.getFirstName(), user.getLastName()); fullName = StringUtils.fullName(user.getFirstName(), user.getLastName());
} }
return new UserInfoResponse( return new UserInfoResponse(
user.getId(), 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") @PostMapping("/me/avatar")
public ResponseEntity<AvatarUploadResponse> uploadAvatar(@RequestParam("avatar") MultipartFile file) { public ResponseEntity<AvatarUploadResponse> uploadAvatar(@RequestParam("avatar") MultipartFile file) {
User user = getAuthenticatedUser(); 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.dto.common.DropdownOption;
import com.petshop.backend.entity.User; import com.petshop.backend.entity.User;
import com.petshop.backend.repository.*; import com.petshop.backend.repository.*;
import com.petshop.backend.util.StringUtils;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -68,7 +69,7 @@ public class DropdownController {
public ResponseEntity<List<DropdownOption>> getCustomers() { public ResponseEntity<List<DropdownOption>> getCustomers() {
return ResponseEntity.ok( return ResponseEntity.ok(
userRepository.findByRoleAndActiveTrue(User.Role.CUSTOMER).stream() 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)) .sorted(Comparator.comparing(DropdownOption::getLabel, String.CASE_INSENSITIVE_ORDER))
.collect(Collectors.toList()) .collect(Collectors.toList())
); );
@@ -90,7 +91,7 @@ public class DropdownController {
return ResponseEntity.ok( return ResponseEntity.ok(
userRepository.findByRoleAndActiveTrue(User.Role.CUSTOMER).stream() userRepository.findByRoleAndActiveTrue(User.Role.CUSTOMER).stream()
.filter(u -> customersWithPets.contains(u.getId())) .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)) .sorted(Comparator.comparing(DropdownOption::getLabel, String.CASE_INSENSITIVE_ORDER))
.collect(Collectors.toList()) .collect(Collectors.toList())
); );
@@ -190,7 +191,7 @@ public class DropdownController {
} }
return ResponseEntity.ok( return ResponseEntity.ok(
employees.stream() 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)) .sorted(Comparator.comparing(DropdownOption::getLabel, String.CASE_INSENSITIVE_ORDER))
.collect(Collectors.toList()) .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.entity.User;
import com.petshop.backend.repository.ActivityLogRepository; import com.petshop.backend.repository.ActivityLogRepository;
import com.petshop.backend.repository.UserRepository; import com.petshop.backend.repository.UserRepository;
import com.petshop.backend.util.StringUtils;
import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Predicate;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -48,7 +49,10 @@ public class ActivityLogService {
entry.setUser(managedUser); entry.setUser(managedUser);
entry.setStore(store); entry.setStore(store);
entry.setUsernameSnapshot(managedUser.getUsername()); 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.setRoleSnapshot(managedUser.getRole() != null ? managedUser.getRole().name() : null);
entry.setStoreNameSnapshot(store != null ? store.getStoreName() : null); entry.setStoreNameSnapshot(store != null ? store.getStoreName() : null);
entry.setActivity(activity.trim()); entry.setActivity(activity.trim());
@@ -127,7 +131,10 @@ public class ActivityLogService {
if (entry.getUser() != null) { if (entry.getUser() != null) {
response.setUserId(entry.getUser().getId()); response.setUserId(entry.getUser().getId());
response.setUsername(firstNonBlank(entry.getUsernameSnapshot(), entry.getUser().getUsername())); 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)); response.setRole(firstNonBlank(entry.getRoleSnapshot(), entry.getUser().getRole() != null ? entry.getUser().getRole().name() : null));
} }
@@ -147,24 +154,6 @@ public class ActivityLogService {
return response; 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) { private String firstNonBlank(String preferred, String fallback) {
if (preferred != null && !preferred.isBlank()) { if (preferred != null && !preferred.isBlank()) {
return preferred; return preferred;

View File

@@ -256,9 +256,9 @@ public class AdoptionService {
adoption.getPet().getPetId(), adoption.getPet().getPetId(),
adoption.getPet().getPetName(), adoption.getPet().getPetName(),
adoption.getCustomer().getId(), adoption.getCustomer().getId(),
adoption.getCustomer().getFirstName() + " " + adoption.getCustomer().getLastName(), StringUtils.fullName(adoption.getCustomer().getFirstName(), adoption.getCustomer().getLastName()),
adoption.getEmployee().getId(), 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.getStoreId() : null,
sourceStore != null ? sourceStore.getStoreName() : null, sourceStore != null ? sourceStore.getStoreName() : null,
adoption.getAdoptionDate(), 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.InventoryRepository;
import com.petshop.backend.repository.ProductRepository; import com.petshop.backend.repository.ProductRepository;
import com.petshop.backend.repository.SaleRepository; import com.petshop.backend.repository.SaleRepository;
import com.petshop.backend.util.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@@ -181,12 +182,12 @@ public class AnalyticsService {
if (sale.getIsRefund()) { if (sale.getIsRefund()) {
continue; 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); employeeRevenue.merge(employeeName, sale.getTotalAmount(), BigDecimal::add);
} }
if (user.getRole() == User.Role.STAFF && employeeRevenue.isEmpty()) { 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); employeeRevenue.put(employeeName, BigDecimal.ZERO);
} }

View File

@@ -324,7 +324,7 @@ public class AppointmentService {
response.setAppointmentId(appointment.getAppointmentId()); response.setAppointmentId(appointment.getAppointmentId());
if (appointment.getCustomer() != null) { if (appointment.getCustomer() != null) {
response.setCustomerId(appointment.getCustomer().getId()); 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) { if (appointment.getStore() != null) {
response.setStoreId(appointment.getStore().getStoreId()); response.setStoreId(appointment.getStore().getStoreId());
@@ -339,7 +339,7 @@ public class AppointmentService {
response.setAppointmentStatus(appointment.getAppointmentStatus()); response.setAppointmentStatus(appointment.getAppointmentStatus());
if (appointment.getEmployee() != null) { if (appointment.getEmployee() != null) {
response.setEmployeeId(appointment.getEmployee().getId()); 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.setPetName(pet != null ? pet.getPetName() : null);
response.setPetId(pet != null ? pet.getPetId() : 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.Sale;
import com.petshop.backend.entity.SaleItem; import com.petshop.backend.entity.SaleItem;
import com.petshop.backend.entity.User; import com.petshop.backend.entity.User;
import com.petshop.backend.util.StringUtils;
import com.resend.Resend; import com.resend.Resend;
import com.resend.services.emails.model.CreateEmailOptions; import com.resend.services.emails.model.CreateEmailOptions;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -246,7 +247,7 @@ public class EmailService {
String date = appointment.getAppointmentDate() != null ? appointment.getAppointmentDate().format(DATE_FMT) : ""; String date = appointment.getAppointmentDate() != null ? appointment.getAppointmentDate().format(DATE_FMT) : "";
String time = appointment.getAppointmentTime() != null ? appointment.getAppointmentTime().format(TIME_FMT) : ""; String time = appointment.getAppointmentTime() != null ? appointment.getAppointmentTime().format(TIME_FMT) : "";
String employee = appointment.getEmployee() != null 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; String pet = appointment.getPet() != null ? appointment.getPet().getPetName() : null;
return """ return """
<div style="font-family:sans-serif;max-width:600px;margin:auto"> <div style="font-family:sans-serif;max-width:600px;margin:auto">

View File

@@ -330,7 +330,7 @@ public class PetService {
pet.getCreatedAt(), pet.getCreatedAt(),
pet.getUpdatedAt(), pet.getUpdatedAt(),
owner != null ? owner.getId() : null, 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.getStoreId() : null,
store != null ? store.getStoreName() : null store != null ? store.getStoreName() : null
); );

View File

@@ -334,7 +334,7 @@ public class SaleService {
if (sale.getEmployee() != null) { if (sale.getEmployee() != null) {
response.setEmployeeId(sale.getEmployee().getId()); 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) { if (sale.getStore() != null) {
@@ -344,7 +344,7 @@ public class SaleService {
if (sale.getCustomer() != null) { if (sale.getCustomer() != null) {
response.setCustomerId(sale.getCustomer().getId()); 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()); response.setTotalAmount(sale.getTotalAmount());

View File

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