|
|
@ -21,6 +21,7 @@ import io.swagger.annotations.ApiOperation; |
|
|
import io.swagger.annotations.ApiParam; |
|
|
import io.swagger.annotations.ApiParam; |
|
|
import lombok.Getter; |
|
|
import lombok.Getter; |
|
|
import lombok.RequiredArgsConstructor; |
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
import org.springframework.beans.factory.annotation.Value; |
|
|
import org.springframework.beans.factory.annotation.Value; |
|
|
import org.springframework.context.ApplicationEventPublisher; |
|
|
import org.springframework.context.ApplicationEventPublisher; |
|
|
import org.springframework.http.HttpStatus; |
|
|
import org.springframework.http.HttpStatus; |
|
|
@ -38,7 +39,9 @@ import org.springframework.web.bind.annotation.ResponseStatus; |
|
|
import org.springframework.web.bind.annotation.RestController; |
|
|
import org.springframework.web.bind.annotation.RestController; |
|
|
import org.thingsboard.common.util.JacksonUtil; |
|
|
import org.thingsboard.common.util.JacksonUtil; |
|
|
import org.thingsboard.rule.engine.api.MailService; |
|
|
import org.thingsboard.rule.engine.api.MailService; |
|
|
|
|
|
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.UserData; |
|
|
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.CustomerId; |
|
|
import org.thingsboard.server.common.data.id.CustomerId; |
|
|
@ -46,6 +49,16 @@ import org.thingsboard.server.common.data.id.TenantId; |
|
|
import org.thingsboard.server.common.data.id.UserId; |
|
|
import org.thingsboard.server.common.data.id.UserId; |
|
|
import org.thingsboard.server.common.data.page.PageData; |
|
|
import org.thingsboard.server.common.data.page.PageData; |
|
|
import org.thingsboard.server.common.data.page.PageLink; |
|
|
import org.thingsboard.server.common.data.page.PageLink; |
|
|
|
|
|
import org.thingsboard.server.common.data.query.EntityData; |
|
|
|
|
|
import org.thingsboard.server.common.data.query.EntityDataPageLink; |
|
|
|
|
|
import org.thingsboard.server.common.data.query.EntityDataQuery; |
|
|
|
|
|
import org.thingsboard.server.common.data.query.EntityDataSortOrder; |
|
|
|
|
|
import org.thingsboard.server.common.data.query.EntityKey; |
|
|
|
|
|
import org.thingsboard.server.common.data.query.EntityKeyType; |
|
|
|
|
|
import org.thingsboard.server.common.data.query.EntityTypeFilter; |
|
|
|
|
|
import org.thingsboard.server.common.data.query.FilterPredicateValue; |
|
|
|
|
|
import org.thingsboard.server.common.data.query.KeyFilter; |
|
|
|
|
|
import org.thingsboard.server.common.data.query.StringFilterPredicate; |
|
|
import org.thingsboard.server.common.data.security.Authority; |
|
|
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; |
|
|
@ -53,6 +66,7 @@ import org.thingsboard.server.common.data.security.event.UserCredentialsInvalida |
|
|
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.common.data.security.model.JwtPair; |
|
|
|
|
|
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; |
|
|
import org.thingsboard.server.service.security.model.token.JwtTokenFactory; |
|
|
import org.thingsboard.server.service.security.model.token.JwtTokenFactory; |
|
|
@ -62,8 +76,14 @@ import org.thingsboard.server.service.security.system.SystemSecurityService; |
|
|
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest; |
|
|
import javax.servlet.http.HttpServletRequest; |
|
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
import java.util.Arrays; |
|
|
import java.util.Arrays; |
|
|
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
|
|
|
|
import static org.thingsboard.server.common.data.StringUtils.isNotEmpty; |
|
|
|
|
|
import static org.thingsboard.server.common.data.query.EntityKeyType.ENTITY_FIELD; |
|
|
|
|
|
import static org.thingsboard.server.common.data.query.FilterPredicateValue.fromString; |
|
|
|
|
|
import static org.thingsboard.server.common.data.query.StringFilterPredicate.StringOperation.EQUAL; |
|
|
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; |
|
|
@ -106,6 +126,9 @@ public class UserController extends BaseController { |
|
|
private final ApplicationEventPublisher eventPublisher; |
|
|
private final ApplicationEventPublisher eventPublisher; |
|
|
private final TbUserService tbUserService; |
|
|
private final TbUserService tbUserService; |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
|
private EntityQueryService entityQueryService; |
|
|
|
|
|
|
|
|
@ApiOperation(value = "Get User (getUserById)", |
|
|
@ApiOperation(value = "Get User (getUserById)", |
|
|
notes = "Fetch the User object based on the provided User Id. " + |
|
|
notes = "Fetch the User object based on the provided User Id. " + |
|
|
"If the user has the authority of 'SYS_ADMIN', the server does not perform additional checks. " + |
|
|
"If the user has the authority of 'SYS_ADMIN', the server does not perform additional checks. " + |
|
|
@ -304,6 +327,66 @@ public class UserController extends BaseController { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ApiOperation(value = "Find users by query (findUsersByQuery)", |
|
|
|
|
|
notes = "Returns a page of user data owned by tenant or customer." + |
|
|
|
|
|
PAGE_DATA_PARAMETERS + TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH) |
|
|
|
|
|
@PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") |
|
|
|
|
|
@RequestMapping(value = "/users/find", method = RequestMethod.GET) |
|
|
|
|
|
@ResponseBody |
|
|
|
|
|
public PageData<UserData> findUsersByQuery( |
|
|
|
|
|
@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 { |
|
|
|
|
|
SecurityUser securityUser = getCurrentUser(); |
|
|
|
|
|
|
|
|
|
|
|
EntityTypeFilter entityFilter = new EntityTypeFilter(); |
|
|
|
|
|
entityFilter.setEntityType(EntityType.USER); |
|
|
|
|
|
|
|
|
|
|
|
EntityDataPageLink pageLink = new EntityDataPageLink(pageSize, page, textSearch, createEntityDataSortOrder(sortProperty, sortOrder)); |
|
|
|
|
|
|
|
|
|
|
|
List<EntityKey> entityFields = Arrays.asList(new EntityKey(ENTITY_FIELD, "firstName"), |
|
|
|
|
|
new EntityKey(ENTITY_FIELD, "lastName"), |
|
|
|
|
|
new EntityKey(ENTITY_FIELD, "email")); |
|
|
|
|
|
|
|
|
|
|
|
List<KeyFilter> keyFilters = new ArrayList<>(); |
|
|
|
|
|
KeyFilter tenantIdFilter = KeyFilter.builder() |
|
|
|
|
|
.key(new EntityKey(ENTITY_FIELD, "tenantId")) |
|
|
|
|
|
.predicate(StringFilterPredicate.builder() |
|
|
|
|
|
.operation(EQUAL) |
|
|
|
|
|
.value(fromString(securityUser.getTenantId().getId().toString())).build()) |
|
|
|
|
|
.build(); |
|
|
|
|
|
keyFilters.add(tenantIdFilter); |
|
|
|
|
|
|
|
|
|
|
|
if (!Authority.TENANT_ADMIN.equals(securityUser.getAuthority())) { |
|
|
|
|
|
KeyFilter customerIdFilter = KeyFilter.builder() |
|
|
|
|
|
.key(new EntityKey(ENTITY_FIELD, "customerId")) |
|
|
|
|
|
.predicate(StringFilterPredicate.builder() |
|
|
|
|
|
.operation(EQUAL) |
|
|
|
|
|
.value(fromString(securityUser.getCustomerId().getId().toString())).build()) |
|
|
|
|
|
.build(); |
|
|
|
|
|
keyFilters.add(customerIdFilter); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
EntityDataQuery query = new EntityDataQuery(entityFilter, pageLink, entityFields, null, keyFilters); |
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
|
return entityQueryService.findEntityDataByQuery(securityUser, query).mapData(entityData -> |
|
|
|
|
|
new UserData(UserId.fromString(entityData.getEntityId().getId().toString()), |
|
|
|
|
|
entityData.getLatest().get(ENTITY_FIELD).get("email").getValue(), |
|
|
|
|
|
entityData.getLatest().get(ENTITY_FIELD).get("firstName").getValue(), |
|
|
|
|
|
entityData.getLatest().get(ENTITY_FIELD).get("lastName").getValue())); |
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
throw handleException(e); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ApiOperation(value = "Get Tenant Users (getTenantAdmins)", |
|
|
@ApiOperation(value = "Get Tenant Users (getTenantAdmins)", |
|
|
notes = "Returns a page of users owned by tenant. " + PAGE_DATA_PARAMETERS + SYSTEM_AUTHORITY_PARAGRAPH) |
|
|
notes = "Returns a page of users owned by tenant. " + PAGE_DATA_PARAMETERS + SYSTEM_AUTHORITY_PARAGRAPH) |
|
|
@PreAuthorize("hasAuthority('SYS_ADMIN')") |
|
|
@PreAuthorize("hasAuthority('SYS_ADMIN')") |
|
|
@ -434,4 +517,17 @@ public class UserController extends BaseController { |
|
|
SecurityUser currentUser = getCurrentUser(); |
|
|
SecurityUser currentUser = getCurrentUser(); |
|
|
userSettingsService.deleteUserSettings(currentUser.getTenantId(), currentUser.getId(), Arrays.asList(paths.split(","))); |
|
|
userSettingsService.deleteUserSettings(currentUser.getTenantId(), currentUser.getId(), Arrays.asList(paths.split(","))); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private EntityDataSortOrder createEntityDataSortOrder(String sortProperty, String sortOrder) { |
|
|
|
|
|
if (isNotEmpty(sortProperty)) { |
|
|
|
|
|
EntityDataSortOrder entityDataSortOrder = new EntityDataSortOrder(); |
|
|
|
|
|
entityDataSortOrder.setKey(new EntityKey(ENTITY_FIELD, sortProperty)); |
|
|
|
|
|
if (isNotEmpty(sortOrder)) { |
|
|
|
|
|
entityDataSortOrder.setDirection(EntityDataSortOrder.Direction.valueOf(sortOrder)); |
|
|
|
|
|
} |
|
|
|
|
|
return entityDataSortOrder; |
|
|
|
|
|
} else { |
|
|
|
|
|
return null; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|