diff --git a/application/src/main/java/org/thingsboard/server/controller/UserController.java b/application/src/main/java/org/thingsboard/server/controller/UserController.java index d49b2b04df..002b27d265 100644 --- a/application/src/main/java/org/thingsboard/server/controller/UserController.java +++ b/application/src/main/java/org/thingsboard/server/controller/UserController.java @@ -105,6 +105,7 @@ import static org.thingsboard.server.controller.ControllerConstants.USER_ID_PARA import static org.thingsboard.server.controller.ControllerConstants.USER_SORT_PROPERTY_ALLOWABLE_VALUES; import static org.thingsboard.server.controller.ControllerConstants.USER_TEXT_SEARCH_DESCRIPTION; import static org.thingsboard.server.controller.ControllerConstants.UUID_WIKI_LINK; +import static org.thingsboard.server.dao.entity.BaseEntityService.NULL_CUSTOMER_ID; @RequiredArgsConstructor @RestController @@ -439,32 +440,28 @@ public class UserController extends BaseController { @RequestParam(required = false) String sortProperty, @ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES) @RequestParam(required = false) String sortOrder) throws ThingsboardException { - try { - checkParameter("alarmId", strAlarmId); - AlarmId alarmEntityId = new AlarmId(toUUID(strAlarmId)); - Alarm alarm = checkAlarmId(alarmEntityId, Operation.READ); - SecurityUser currentUser = getCurrentUser(); - TenantId tenantId = currentUser.getTenantId(); - CustomerId originatorCustomerId = entityService.fetchEntityCustomerId(tenantId, alarm.getOriginator()).get(); - PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); - PageData pageData; - if (Authority.TENANT_ADMIN.equals(currentUser.getAuthority())) { - if (alarm.getCustomerId() == null) { - pageData = userService.findTenantAdmins(tenantId, pageLink); - } else { - ArrayList customerIds = new ArrayList<>(Collections.singletonList(new CustomerId(CustomerId.NULL_UUID))); - if (!CustomerId.NULL_UUID.equals(originatorCustomerId.getId())) { - customerIds.add(originatorCustomerId); - } - pageData = userService.findUsersByCustomerIds(tenantId, customerIds, pageLink); - } + checkParameter("alarmId", strAlarmId); + AlarmId alarmEntityId = new AlarmId(toUUID(strAlarmId)); + Alarm alarm = checkAlarmId(alarmEntityId, Operation.READ); + SecurityUser currentUser = getCurrentUser(); + TenantId tenantId = currentUser.getTenantId(); + CustomerId originatorCustomerId = entityService.fetchEntityCustomerId(tenantId, alarm.getOriginator()).orElse(NULL_CUSTOMER_ID); + PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); + PageData pageData; + if (Authority.TENANT_ADMIN.equals(currentUser.getAuthority())) { + if (alarm.getCustomerId() == null) { + pageData = userService.findTenantAdmins(tenantId, pageLink); } else { - pageData = userService.findCustomerUsers(tenantId, alarm.getCustomerId(), pageLink); + ArrayList customerIds = new ArrayList<>(Collections.singletonList(NULL_CUSTOMER_ID)); + if (!CustomerId.NULL_UUID.equals(originatorCustomerId.getId())) { + customerIds.add(originatorCustomerId); + } + pageData = userService.findUsersByCustomerIds(tenantId, customerIds, pageLink); } - return pageData.mapData(user -> new UserEmailInfo(user.getId(), user.getEmail(), user.getFirstName(), user.getLastName())); - } catch (Exception e) { - throw handleException(e); + } else { + pageData = userService.findCustomerUsers(tenantId, alarm.getCustomerId(), pageLink); } + return pageData.mapData(user -> new UserEmailInfo(user.getId(), user.getEmail(), user.getFirstName(), user.getLastName())); } @ApiOperation(value = "Save user settings (saveUserSettings)", diff --git a/application/src/test/java/org/thingsboard/server/controller/UserControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/UserControllerTest.java index 28bb987257..d37b4ebe5b 100644 --- a/application/src/test/java/org/thingsboard/server/controller/UserControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/UserControllerTest.java @@ -49,6 +49,7 @@ import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.settings.StarredDashboardInfo; import org.thingsboard.server.common.data.settings.UserDashboardsInfo; +import org.thingsboard.server.dao.device.DeviceService; import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.service.DaoSqlTest; import org.thingsboard.server.dao.user.UserDao; @@ -81,6 +82,9 @@ public class UserControllerTest extends AbstractControllerTest { @Autowired private UserDao userDao; + @Autowired + private DeviceService deviceService; + static class Config { @Bean @Primary @@ -740,6 +744,43 @@ public class UserControllerTest extends AbstractControllerTest { Assert.assertEquals(expectedCustomerUserIds, loadedUserIds); } + @Test + public void testGetUsersForDeletedAlarmOriginator() throws Exception { + loginTenantAdmin(); + + String email = "testEmail1"; + for (int i = 0; i < 45; i++) { + User customerUser = createCustomerUser( customerId); + customerUser.setEmail(email + StringUtils.randomAlphanumeric((int) (5 + Math.random() * 10)) + "@thingsboard.org"); + doPost("/api/user", customerUser, User.class); + } + + Device device = new Device(); + device.setName("testDevice"); + device.setCustomerId(customerId); + Device savedDevice = doPost("/api/device", device, Device.class); + + Alarm alarm = createTestAlarm(savedDevice); + + deviceService.deleteDevice(tenantId, savedDevice.getId()); + + List loadedUserIds = new ArrayList<>(); + PageLink pageLink = new PageLink(33, 0); + PageData pageData; + do { + pageData = doGetTypedWithPageLink("/api/users/assign/" + alarm.getId().getId().toString() + "?", + new TypeReference<>() {}, pageLink); + loadedUserIds.addAll(pageData.getData().stream().map(UserEmailInfo::getId) + .collect(Collectors.toList())); + if (pageData.hasNext()) { + pageLink = pageLink.nextPageLink(); + } + } while (pageData.hasNext()); + + Assert.assertEquals(1, loadedUserIds.size()); + Assert.assertEquals(tenantAdminUserId, loadedUserIds.get(0)); + } + @Test public void testDeleteUserWithDeleteRelationsOk() throws Exception { loginSysAdmin();