Browse Source

Added getting users for assignment

pull/8256/head
zbeacon 4 years ago
parent
commit
ba6a83e575
  1. 45
      application/src/main/java/org/thingsboard/server/controller/UserController.java
  2. 2
      common/dao-api/src/main/java/org/thingsboard/server/dao/user/UserService.java
  3. 13
      dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java
  4. 10
      dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java
  5. 10
      dao/src/main/java/org/thingsboard/server/dao/user/UserDao.java
  6. 9
      dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java
  7. 7
      ui-ngx/src/app/core/http/user.service.ts
  8. 4
      ui-ngx/src/app/modules/home/components/alarm/alarm-assignee-panel.component.ts

45
application/src/main/java/org/thingsboard/server/controller/UserController.java

@ -42,8 +42,10 @@ import org.thingsboard.rule.engine.api.MailService;
import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.UserEmailInfo; import org.thingsboard.server.common.data.UserEmailInfo;
import org.thingsboard.server.common.data.alarm.Alarm;
import org.thingsboard.server.common.data.exception.ThingsboardErrorCode; import org.thingsboard.server.common.data.exception.ThingsboardErrorCode;
import org.thingsboard.server.common.data.exception.ThingsboardException; import org.thingsboard.server.common.data.exception.ThingsboardException;
import org.thingsboard.server.common.data.id.AlarmId;
import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.id.UserId;
@ -58,9 +60,9 @@ import org.thingsboard.server.common.data.security.Authority;
import org.thingsboard.server.common.data.security.UserCredentials; import org.thingsboard.server.common.data.security.UserCredentials;
import org.thingsboard.server.common.data.security.UserSettings; import org.thingsboard.server.common.data.security.UserSettings;
import org.thingsboard.server.common.data.security.event.UserCredentialsInvalidationEvent; import org.thingsboard.server.common.data.security.event.UserCredentialsInvalidationEvent;
import org.thingsboard.server.common.data.security.model.JwtPair;
import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.entitiy.user.TbUserService; import org.thingsboard.server.service.entitiy.user.TbUserService;
import org.thingsboard.server.common.data.security.model.JwtPair;
import org.thingsboard.server.service.query.EntityQueryService; import org.thingsboard.server.service.query.EntityQueryService;
import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.service.security.model.SecurityUser;
import org.thingsboard.server.service.security.model.UserPrincipal; import org.thingsboard.server.service.security.model.UserPrincipal;
@ -70,12 +72,12 @@ import org.thingsboard.server.service.security.permission.Resource;
import org.thingsboard.server.service.security.system.SystemSecurityService; import org.thingsboard.server.service.security.system.SystemSecurityService;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import static org.thingsboard.server.common.data.query.EntityKeyType.ENTITY_FIELD; import static org.thingsboard.server.common.data.query.EntityKeyType.ENTITY_FIELD;
import static org.thingsboard.server.controller.ControllerConstants.ALARM_ID_PARAM_DESCRIPTION;
import static org.thingsboard.server.controller.ControllerConstants.CUSTOMER_ID; import static org.thingsboard.server.controller.ControllerConstants.CUSTOMER_ID;
import static org.thingsboard.server.controller.ControllerConstants.CUSTOMER_ID_PARAM_DESCRIPTION; import static org.thingsboard.server.controller.ControllerConstants.CUSTOMER_ID_PARAM_DESCRIPTION;
import static org.thingsboard.server.controller.ControllerConstants.DEFAULT_DASHBOARD; import static org.thingsboard.server.controller.ControllerConstants.DEFAULT_DASHBOARD;
@ -440,6 +442,45 @@ public class UserController extends BaseController {
} }
} }
@ApiOperation(value = "Get usersForAssign (getUsersForAssign)",
notes = "Returns page of user data objects that can be assigned to provided alarmId. " +
"Search is been executed by email, firstName and lastName fields. " +
PAGE_DATA_PARAMETERS + TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH)
@PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
@RequestMapping(value = "/users/assign", params = {"alarmId", "pageSize", "page"}, method = RequestMethod.GET)
@ResponseBody
public PageData<UserEmailInfo> getAssignees(
@ApiParam(value = ALARM_ID_PARAM_DESCRIPTION)
@RequestParam String alarmId,
@ApiParam(value = PAGE_SIZE_DESCRIPTION, required = true)
@RequestParam int pageSize,
@ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true)
@RequestParam int page,
@ApiParam(value = USER_TEXT_SEARCH_DESCRIPTION)
@RequestParam(required = false) String textSearch,
@ApiParam(value = SORT_PROPERTY_DESCRIPTION, allowableValues = USER_SORT_PROPERTY_ALLOWABLE_VALUES)
@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", alarmId);
AlarmId alarmEntityId = new AlarmId(toUUID(alarmId));
Alarm alarm = checkAlarmId(alarmEntityId, Operation.READ);
SecurityUser currentUser = getCurrentUser();
TenantId tenantId = currentUser.getTenantId();
PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder);
PageData<User> pageData;
if (Authority.TENANT_ADMIN.equals(currentUser.getAuthority())) {
pageData = userService.findUsersForAssignForTenant(tenantId, alarm.getCustomerId(), pageLink);
} else {
pageData = userService.findCustomerUsers(tenantId, alarm.getCustomerId(), pageLink);
}
return pageData.mapData(user -> new UserEmailInfo(user.getId(), user.getEmail(), user.getFirstName(), user.getLastName()));
} catch (Exception e) {
throw handleException(e);
}
}
@ApiOperation(value = "Save user settings (saveUserSettings)", @ApiOperation(value = "Save user settings (saveUserSettings)",
notes = "Save user settings represented in json format for authorized user. " ) notes = "Save user settings represented in json format for authorized user. " )
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")

2
common/dao-api/src/main/java/org/thingsboard/server/dao/user/UserService.java

@ -64,6 +64,8 @@ public interface UserService extends EntityDaoService {
PageData<User> findCustomerUsers(TenantId tenantId, CustomerId customerId, PageLink pageLink); PageData<User> findCustomerUsers(TenantId tenantId, CustomerId customerId, PageLink pageLink);
PageData<User> findUsersForAssignForTenant(TenantId tenantId, CustomerId customerId, PageLink pageLink);
void deleteCustomerUsers(TenantId tenantId, CustomerId customerId); void deleteCustomerUsers(TenantId tenantId, CustomerId customerId);
void setUserCredentialsEnabled(TenantId tenantId, UserId userId, boolean enabled); void setUserCredentialsEnabled(TenantId tenantId, UserId userId, boolean enabled);

13
dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java

@ -100,6 +100,19 @@ public class JpaUserDao extends JpaAbstractSearchTextDao<UserEntity, User> imple
} }
@Override
public PageData<User> findUsersForAssignForTenant(UUID tenantId, UUID customerId, PageLink pageLink) {
return DaoUtil.toPageData(
userRepository
.findUsersByCustomerIdAndNullCustomerId(
tenantId,
customerId,
Objects.toString(pageLink.getTextSearch(), ""),
NULL_UUID,
DaoUtil.toPageable(pageLink)));
}
@Override @Override
public Long countByTenantId(TenantId tenantId) { public Long countByTenantId(TenantId tenantId) {
return userRepository.countByTenantId(tenantId.getId()); return userRepository.countByTenantId(tenantId.getId());

10
dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java

@ -20,7 +20,6 @@ import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param; import org.springframework.data.repository.query.Param;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.security.Authority;
import org.thingsboard.server.dao.model.sql.UserEntity; import org.thingsboard.server.dao.model.sql.UserEntity;
@ -44,6 +43,15 @@ public interface UserRepository extends JpaRepository<UserEntity, UUID> {
@Param("authority") Authority authority, @Param("authority") Authority authority,
Pageable pageable); Pageable pageable);
@Query("SELECT u FROM UserEntity u WHERE u.tenantId = :tenantId " +
"AND u.customerId IN (:customerId, :nullCustomerId) " +
"AND LOWER(u.searchText) LIKE LOWER(CONCAT('%', :searchText, '%'))")
Page<UserEntity> findUsersByCustomerIdAndNullCustomerId(@Param("tenantId") UUID tenantId,
@Param("customerId") UUID customerId,
@Param("searchText") String searchText,
@Param("nullCustomerId") UUID nullCustomerId,
Pageable pageable);
@Query("SELECT u FROM UserEntity u WHERE u.tenantId = :tenantId " + @Query("SELECT u FROM UserEntity u WHERE u.tenantId = :tenantId " +
"AND LOWER(u.searchText) LIKE LOWER(CONCAT('%', :searchText, '%'))") "AND LOWER(u.searchText) LIKE LOWER(CONCAT('%', :searchText, '%'))")
Page<UserEntity> findByTenantId(@Param("tenantId") UUID tenantId, Page<UserEntity> findByTenantId(@Param("tenantId") UUID tenantId,

10
dao/src/main/java/org/thingsboard/server/dao/user/UserDao.java

@ -79,4 +79,14 @@ public interface UserDao extends Dao<User>, TenantEntityDao {
*/ */
PageData<User> findCustomerUsers(UUID tenantId, UUID customerId, PageLink pageLink); PageData<User> findCustomerUsers(UUID tenantId, UUID customerId, PageLink pageLink);
/**
* Find users for alarm assignment by tenantId, customerId and page link.
*
* @param tenantId the tenantId
* @param customerId the customerId
* @param pageLink the page link
* @return the list of user entities
*/
PageData<User> findUsersForAssignForTenant(UUID tenantId, UUID customerId, PageLink pageLink);
} }

9
dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java

@ -265,6 +265,15 @@ public class UserServiceImpl extends AbstractEntityService implements UserServic
return userDao.findCustomerUsers(tenantId.getId(), customerId.getId(), pageLink); return userDao.findCustomerUsers(tenantId.getId(), customerId.getId(), pageLink);
} }
@Override
public PageData<User> findUsersForAssignForTenant(TenantId tenantId, CustomerId customerId, PageLink pageLink) {
log.trace("Executing findUsersForAssignForTenant, tenantId [{}], customerId [{}], pageLink [{}]", tenantId, customerId, pageLink);
validateId(tenantId, INCORRECT_TENANT_ID + tenantId);
validateId(customerId, "Incorrect customerId " + customerId);
validatePageLink(pageLink);
return userDao.findUsersForAssignForTenant(tenantId.getId(), customerId.getId(), pageLink);
}
@Override @Override
public void deleteCustomerUsers(TenantId tenantId, CustomerId customerId) { public void deleteCustomerUsers(TenantId tenantId, CustomerId customerId) {
log.trace("Executing deleteCustomerUsers, customerId [{}]", customerId); log.trace("Executing deleteCustomerUsers, customerId [{}]", customerId);

7
ui-ngx/src/app/core/http/user.service.ts

@ -51,6 +51,13 @@ export class UserService {
defaultHttpOptionsFromConfig(config)); defaultHttpOptionsFromConfig(config));
} }
public getUsersForAssign(alarmId: string, pageLink: PageLink,
config?: RequestConfig): Observable<PageData<UserEmailInfo>> {
let url = `/api/users/assign${pageLink.toQuery()}`;
url += `&alarmId=` + alarmId;
return this.http.get<PageData<UserEmailInfo>>(url, defaultHttpOptionsFromConfig(config));
}
public getUser(userId: string, config?: RequestConfig): Observable<User> { public getUser(userId: string, config?: RequestConfig): Observable<User> {
return this.http.get<User>(`/api/user/${userId}`, defaultHttpOptionsFromConfig(config)); return this.http.get<User>(`/api/user/${userId}`, defaultHttpOptionsFromConfig(config));
} }

4
ui-ngx/src/app/modules/home/components/alarm/alarm-assignee-panel.component.ts

@ -44,6 +44,8 @@ import { AlarmService } from '@core/http/alarm.service';
import { OverlayRef } from '@angular/cdk/overlay'; import { OverlayRef } from '@angular/cdk/overlay';
import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete';
import { UtilsService } from '@core/services/utils.service'; import { UtilsService } from '@core/services/utils.service';
import {Authority} from "@shared/models/authority.enum";
import {NULL_UUID} from "@shared/models/id/has-uuid";
export const ALARM_ASSIGNEE_PANEL_DATA = new InjectionToken<any>('AlarmAssigneePanelData'); export const ALARM_ASSIGNEE_PANEL_DATA = new InjectionToken<any>('AlarmAssigneePanelData');
@ -144,7 +146,7 @@ export class AlarmAssigneePanelComponent implements OnInit, AfterViewInit, OnDe
property: 'email', property: 'email',
direction: Direction.ASC direction: Direction.ASC
}); });
return this.userService.findUsersByQuery(pageLink, {ignoreLoading: true}) return this.userService.getUsersForAssign(this.alarmId, pageLink, {ignoreLoading: true})
.pipe( .pipe(
catchError(() => of(emptyPageData<UserEmailInfo>())), catchError(() => of(emptyPageData<UserEmailInfo>())),
map(pageData => { map(pageData => {

Loading…
Cancel
Save