backend DRY/KISS cleanup #324
@@ -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();
|
||||
|
||||
@@ -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())
|
||||
);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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
|
||||
);
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user