Allow cross-store staff selection

This commit is contained in:
2026-04-05 23:58:21 -06:00
parent a3d454e119
commit b70afd66aa
6 changed files with 60 additions and 7 deletions

View File

@@ -156,13 +156,20 @@ public class DropdownController {
);
}
@GetMapping("/stores/{storeId}/employees")
@GetMapping({"/stores/{storeId}/employees", "/employees"})
@PreAuthorize("hasAnyRole('CUSTOMER', 'STAFF', 'ADMIN')")
public ResponseEntity<List<DropdownOption>> getStoreEmployees(@PathVariable Long storeId) {
public ResponseEntity<List<DropdownOption>> getStoreEmployees(@PathVariable(required = false) Long storeId) {
List<EmployeeStore> employees;
if (storeId == null || storeId == 0) {
employees = employeeStoreRepository.findActiveAllOrderByEmployeeEmployeeIdAsc();
} else {
employees = employeeStoreRepository.findActiveByStoreStoreIdOrderByEmployeeEmployeeIdAsc(storeId);
}
return ResponseEntity.ok(
employeeStoreRepository.findActiveByStoreStoreIdOrderByEmployeeEmployeeIdAsc(storeId).stream()
employees.stream()
.filter(this::isAssignableEmployee)
.map(this::toEmployeeOption)
.distinct()
.collect(Collectors.toList())
);
}

View File

@@ -15,4 +15,7 @@ public interface EmployeeStoreRepository extends JpaRepository<EmployeeStore, Em
@Query("SELECT es FROM EmployeeStore es WHERE es.store.storeId = :storeId AND es.employee.isActive = true ORDER BY es.employee.employeeId ASC")
List<EmployeeStore> findActiveByStoreStoreIdOrderByEmployeeEmployeeIdAsc(@Param("storeId") Long storeId);
@Query("SELECT es FROM EmployeeStore es WHERE es.employee.isActive = true ORDER BY es.employee.employeeId ASC")
List<EmployeeStore> findActiveAllOrderByEmployeeEmployeeIdAsc();
}

View File

@@ -125,6 +125,33 @@ class DropdownControllerTest {
assertEquals(Long.valueOf(7L), response.getBody().get(0).getId());
}
@Test
void getStoreEmployeesReturnsAllStaffWhenStoreIdIsNull() {
StoreLocation store = new StoreLocation();
store.setStoreId(1L);
Employee staffEmployee = new Employee();
staffEmployee.setEmployeeId(7L);
staffEmployee.setUserId(7L);
staffEmployee.setFirstName("Alex");
staffEmployee.setLastName("Jones");
staffEmployee.setIsActive(true);
User staffUser = new User();
staffUser.setId(7L);
staffUser.setRole(User.Role.STAFF);
staffUser.setActive(true);
when(employeeStoreRepository.findActiveAllOrderByEmployeeEmployeeIdAsc())
.thenReturn(List.of(new EmployeeStore(staffEmployee, store)));
when(userRepository.findById(7L)).thenReturn(Optional.of(staffUser));
var response = controller.getStoreEmployees(null);
assertEquals(1, response.getBody().size());
assertEquals(Long.valueOf(7L), response.getBody().get(0).getId());
}
@Test
void getStoreEmployeesExcludesInactiveStaffUsers() {
StoreLocation store = new StoreLocation();

View File

@@ -121,4 +121,12 @@ public class DropdownApi {
}
return apiClient.getObjectMapper().readValue(response, new TypeReference<List<DropdownOption>>() {});
}
public List<DropdownOption> getEmployees() throws Exception {
String response = apiClient.getRawResponse("/api/v1/dropdowns/employees");
if (response == null || response.isEmpty()) {
throw new IllegalStateException("Empty response from all employees endpoint");
}
return apiClient.getObjectMapper().readValue(response, new TypeReference<List<DropdownOption>>() {});
}
}

View File

@@ -95,7 +95,12 @@ public class AdoptionDialogController {
new Thread(() -> {
try {
Long storeId = UserSession.getInstance().getStoreId();
List<DropdownOption> employees = storeId != null && storeId > 0 ? DropdownApi.getInstance().getStoreEmployees(storeId) : List.of();
List<DropdownOption> employees;
if (storeId != null && storeId > 0) {
employees = DropdownApi.getInstance().getStoreEmployees(storeId);
} else {
employees = DropdownApi.getInstance().getEmployees();
}
Platform.runLater(() -> {
cbEmployee.setItems(FXCollections.observableArrayList(employees));
applySelectedEmployee();

View File

@@ -427,9 +427,12 @@ public class AppointmentDialogController {
new Thread(() -> {
try {
Long storeId = UserSession.getInstance().getStoreId();
List<DropdownOption> employees = storeId != null && storeId > 0
? DropdownApi.getInstance().getStoreEmployees(storeId)
: List.of();
List<DropdownOption> employees;
if (storeId != null && storeId > 0) {
employees = DropdownApi.getInstance().getStoreEmployees(storeId);
} else {
employees = DropdownApi.getInstance().getEmployees();
}
Platform.runLater(() -> {
cbEmployee.setItems(FXCollections.observableArrayList(employees));
applySelectedEmployee();