Browse Source

Improve audit logs page link

pull/1954/head
Igor Kulikov 7 years ago
parent
commit
c8ec87f41d
  1. 38
      application/src/main/java/org/thingsboard/server/controller/AuditLogController.java
  2. 80
      dao/src/main/java/org/thingsboard/server/dao/sql/audit/AuditLogRepository.java
  3. 86
      dao/src/main/java/org/thingsboard/server/dao/sql/audit/JpaAuditLogDao.java
  4. 2
      ui-ngx/src/app/modules/home/pages/device/device-tabs.component.html

38
application/src/main/java/org/thingsboard/server/controller/AuditLogController.java

@ -44,14 +44,15 @@ public class AuditLogController extends BaseController {
@PathVariable("customerId") String strCustomerId,
@RequestParam int pageSize,
@RequestParam int page,
@RequestParam(required = false) String textSearch,
@RequestParam(required = false) String sortProperty,
@RequestParam(required = false) String sortOrder,
@RequestParam(required = false) Long startTime,
@RequestParam(required = false) Long endTime,
@RequestParam(required = false, defaultValue = "false") boolean ascOrder) throws ThingsboardException {
@RequestParam(required = false) Long endTime) throws ThingsboardException {
try {
checkParameter("CustomerId", strCustomerId);
TenantId tenantId = getCurrentUser().getTenantId();
TimePageLink pageLink = createTimePageLink(pageSize, page, "",
"createdTime", ascOrder ? "asc" : "desc", startTime, endTime);
TimePageLink pageLink = createTimePageLink(pageSize, page, textSearch, sortProperty, sortOrder, startTime, endTime);
return checkNotNull(auditLogService.findAuditLogsByTenantIdAndCustomerId(tenantId, new CustomerId(UUID.fromString(strCustomerId)), pageLink));
} catch (Exception e) {
throw handleException(e);
@ -65,15 +66,15 @@ public class AuditLogController extends BaseController {
@PathVariable("userId") String strUserId,
@RequestParam int pageSize,
@RequestParam int page,
@RequestParam(required = false) String textSearch,
@RequestParam(required = false) String sortProperty,
@RequestParam(required = false) String sortOrder,
@RequestParam(required = false) Long startTime,
@RequestParam(required = false) Long endTime,
@RequestParam(required = false, defaultValue = "false") boolean ascOrder) throws ThingsboardException {
@RequestParam(required = false) Long endTime) throws ThingsboardException {
try {
checkParameter("UserId", strUserId);
TenantId tenantId = getCurrentUser().getTenantId();
TimePageLink pageLink = createTimePageLink(pageSize, page, "",
"createdTime", ascOrder ? "asc" : "desc", startTime, endTime);
return checkNotNull(auditLogService.findAuditLogsByTenantIdAndUserId(tenantId, new UserId(UUID.fromString(strUserId)), pageLink));
TimePageLink pageLink = createTimePageLink(pageSize, page, textSearch, sortProperty, sortOrder, startTime, endTime); return checkNotNull(auditLogService.findAuditLogsByTenantIdAndUserId(tenantId, new UserId(UUID.fromString(strUserId)), pageLink));
} catch (Exception e) {
throw handleException(e);
}
@ -87,16 +88,16 @@ public class AuditLogController extends BaseController {
@PathVariable("entityId") String strEntityId,
@RequestParam int pageSize,
@RequestParam int page,
@RequestParam(required = false) String textSearch,
@RequestParam(required = false) String sortProperty,
@RequestParam(required = false) String sortOrder,
@RequestParam(required = false) Long startTime,
@RequestParam(required = false) Long endTime,
@RequestParam(required = false, defaultValue = "false") boolean ascOrder) throws ThingsboardException {
@RequestParam(required = false) Long endTime) throws ThingsboardException {
try {
checkParameter("EntityId", strEntityId);
checkParameter("EntityType", strEntityType);
TenantId tenantId = getCurrentUser().getTenantId();
TimePageLink pageLink = createTimePageLink(pageSize, page, "",
"createdTime", ascOrder ? "asc" : "desc", startTime, endTime);
return checkNotNull(auditLogService.findAuditLogsByTenantIdAndEntityId(tenantId, EntityIdFactory.getByTypeAndId(strEntityType, strEntityId), pageLink));
TimePageLink pageLink = createTimePageLink(pageSize, page, textSearch, sortProperty, sortOrder, startTime, endTime); return checkNotNull(auditLogService.findAuditLogsByTenantIdAndEntityId(tenantId, EntityIdFactory.getByTypeAndId(strEntityType, strEntityId), pageLink));
} catch (Exception e) {
throw handleException(e);
}
@ -108,13 +109,14 @@ public class AuditLogController extends BaseController {
public PageData<AuditLog> getAuditLogs(
@RequestParam int pageSize,
@RequestParam int page,
@RequestParam(required = false) String textSearch,
@RequestParam(required = false) String sortProperty,
@RequestParam(required = false) String sortOrder,
@RequestParam(required = false) Long startTime,
@RequestParam(required = false) Long endTime,
@RequestParam(required = false, defaultValue = "false") boolean ascOrder) throws ThingsboardException {
@RequestParam(required = false) Long endTime) throws ThingsboardException {
try {
TenantId tenantId = getCurrentUser().getTenantId();
TimePageLink pageLink = createTimePageLink(pageSize, page, "",
"createdTime", ascOrder ? "asc" : "desc", startTime, endTime);
TimePageLink pageLink = createTimePageLink(pageSize, page, textSearch, sortProperty, sortOrder, startTime, endTime);
return checkNotNull(auditLogService.findAuditLogsByTenantId(tenantId, pageLink));
} catch (Exception e) {
throw handleException(e);

80
dao/src/main/java/org/thingsboard/server/dao/sql/audit/AuditLogRepository.java

@ -15,10 +15,84 @@
*/
package org.thingsboard.server.dao.sql.audit;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.dao.model.sql.AuditLogEntity;
public interface AuditLogRepository extends CrudRepository<AuditLogEntity, String>, JpaSpecificationExecutor<AuditLogEntity> {
public interface AuditLogRepository extends PagingAndSortingRepository<AuditLogEntity, String> {
@Query("SELECT a FROM AuditLogEntity a WHERE " +
"a.tenantId = :tenantId " +
"AND (:startId IS NULL OR a.id >= :startId) " +
"AND (:endId IS NULL OR a.id <= :endId) " +
"AND (LOWER(a.entityType) LIKE LOWER(CONCAT(:textSearch, '%'))" +
"OR LOWER(a.entityName) LIKE LOWER(CONCAT(:textSearch, '%'))" +
"OR LOWER(a.userName) LIKE LOWER(CONCAT(:textSearch, '%'))" +
"OR LOWER(a.actionType) LIKE LOWER(CONCAT(:textSearch, '%'))" +
"OR LOWER(a.actionStatus) LIKE LOWER(CONCAT(:textSearch, '%')))"
)
Page<AuditLogEntity> findByTenantId(
@Param("tenantId") String tenantId,
@Param("textSearch") String textSearch,
@Param("startId") String startId,
@Param("endId") String endId,
Pageable pageable);
@Query("SELECT a FROM AuditLogEntity a WHERE " +
"a.tenantId = :tenantId " +
"AND a.entityType = :entityType AND a.entityId = :entityId " +
"AND (:startId IS NULL OR a.id >= :startId) " +
"AND (:endId IS NULL OR a.id <= :endId) " +
"AND (LOWER(a.entityName) LIKE LOWER(CONCAT(:textSearch, '%'))" +
"OR LOWER(a.userName) LIKE LOWER(CONCAT(:textSearch, '%'))" +
"OR LOWER(a.actionType) LIKE LOWER(CONCAT(:textSearch, '%'))" +
"OR LOWER(a.actionStatus) LIKE LOWER(CONCAT(:textSearch, '%')))"
)
Page<AuditLogEntity> findAuditLogsByTenantIdAndEntityId(@Param("tenantId") String tenantId,
@Param("entityType") EntityType entityType,
@Param("entityId") String entityId,
@Param("textSearch") String textSearch,
@Param("startId") String startId,
@Param("endId") String endId,
Pageable pageable);
@Query("SELECT a FROM AuditLogEntity a WHERE " +
"a.tenantId = :tenantId " +
"AND a.customerId = :customerId " +
"AND (:startId IS NULL OR a.id >= :startId) " +
"AND (:endId IS NULL OR a.id <= :endId) " +
"AND (LOWER(a.entityType) LIKE LOWER(CONCAT(:textSearch, '%'))" +
"OR LOWER(a.entityName) LIKE LOWER(CONCAT(:textSearch, '%'))" +
"OR LOWER(a.userName) LIKE LOWER(CONCAT(:textSearch, '%'))" +
"OR LOWER(a.actionType) LIKE LOWER(CONCAT(:textSearch, '%'))" +
"OR LOWER(a.actionStatus) LIKE LOWER(CONCAT(:textSearch, '%')))"
)
Page<AuditLogEntity> findAuditLogsByTenantIdAndCustomerId(@Param("tenantId") String tenantId,
@Param("customerId") String customerId,
@Param("textSearch") String textSearch,
@Param("startId") String startId,
@Param("endId") String endId,
Pageable pageable);
@Query("SELECT a FROM AuditLogEntity a WHERE " +
"a.tenantId = :tenantId " +
"AND a.userId = :userId " +
"AND (:startId IS NULL OR a.id >= :startId) " +
"AND (:endId IS NULL OR a.id <= :endId) " +
"AND (LOWER(a.entityType) LIKE LOWER(CONCAT(:textSearch, '%'))" +
"OR LOWER(a.entityName) LIKE LOWER(CONCAT(:textSearch, '%'))" +
"OR LOWER(a.actionType) LIKE LOWER(CONCAT(:textSearch, '%'))" +
"OR LOWER(a.actionStatus) LIKE LOWER(CONCAT(:textSearch, '%')))"
)
Page<AuditLogEntity> findAuditLogsByTenantIdAndUserId(@Param("tenantId") String tenantId,
@Param("userId") String userId,
@Param("textSearch") String textSearch,
@Param("startId") String startId,
@Param("endId") String endId,
Pageable pageable);
}

86
dao/src/main/java/org/thingsboard/server/dao/sql/audit/JpaAuditLogDao.java

@ -19,13 +19,8 @@ import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.UUIDConverter;
import org.thingsboard.server.common.data.audit.AuditLog;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.EntityId;
@ -36,18 +31,16 @@ import org.thingsboard.server.dao.DaoUtil;
import org.thingsboard.server.dao.audit.AuditLogDao;
import org.thingsboard.server.dao.model.sql.AuditLogEntity;
import org.thingsboard.server.dao.sql.JpaAbstractDao;
import org.thingsboard.server.dao.sql.JpaAbstractSearchTimeDao;
import org.thingsboard.server.dao.util.SqlDao;
import javax.annotation.PreDestroy;
import javax.persistence.criteria.Predicate;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.concurrent.Executors;
import static org.springframework.data.jpa.domain.Specifications.where;
import static org.thingsboard.server.dao.model.ModelConstants.ID_PROPERTY;
import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID;
import static org.thingsboard.server.dao.DaoUtil.endTimeToId;
import static org.thingsboard.server.dao.DaoUtil.startTimeToId;
@Component
@SqlDao
@ -83,53 +76,52 @@ public class JpaAuditLogDao extends JpaAbstractDao<AuditLogEntity, AuditLog> imp
@Override
public PageData<AuditLog> findAuditLogsByTenantIdAndEntityId(UUID tenantId, EntityId entityId, TimePageLink pageLink) {
return findAuditLogs(tenantId, entityId, null, null, pageLink);
return DaoUtil.toPageData(
auditLogRepository
.findAuditLogsByTenantIdAndEntityId(
fromTimeUUID(tenantId),
entityId.getEntityType(),
fromTimeUUID(entityId.getId()),
Objects.toString(pageLink.getTextSearch(), ""),
startTimeToId(pageLink.getStartTime()),
endTimeToId(pageLink.getEndTime()),
DaoUtil.toPageable(pageLink)));
}
@Override
public PageData<AuditLog> findAuditLogsByTenantIdAndCustomerId(UUID tenantId, CustomerId customerId, TimePageLink pageLink) {
return findAuditLogs(tenantId, null, customerId, null, pageLink);
return DaoUtil.toPageData(
auditLogRepository
.findAuditLogsByTenantIdAndCustomerId(
fromTimeUUID(tenantId),
fromTimeUUID(customerId.getId()),
Objects.toString(pageLink.getTextSearch(), ""),
startTimeToId(pageLink.getStartTime()),
endTimeToId(pageLink.getEndTime()),
DaoUtil.toPageable(pageLink)));
}
@Override
public PageData<AuditLog> findAuditLogsByTenantIdAndUserId(UUID tenantId, UserId userId, TimePageLink pageLink) {
return findAuditLogs(tenantId, null, null, userId, pageLink);
return DaoUtil.toPageData(
auditLogRepository
.findAuditLogsByTenantIdAndUserId(
fromTimeUUID(tenantId),
fromTimeUUID(userId.getId()),
Objects.toString(pageLink.getTextSearch(), ""),
startTimeToId(pageLink.getStartTime()),
endTimeToId(pageLink.getEndTime()),
DaoUtil.toPageable(pageLink)));
}
@Override
public PageData<AuditLog> findAuditLogsByTenantId(UUID tenantId, TimePageLink pageLink) {
return findAuditLogs(tenantId, null, null, null, pageLink);
}
private PageData<AuditLog> findAuditLogs(UUID tenantId, EntityId entityId, CustomerId customerId, UserId userId, TimePageLink pageLink) {
Specification<AuditLogEntity> timeSearchSpec = JpaAbstractSearchTimeDao.getTimeSearchPageSpec(pageLink, "id");
Specification<AuditLogEntity> fieldsSpec = getEntityFieldsSpec(tenantId, entityId, customerId, userId);
Pageable pageable = DaoUtil.toPageable(pageLink);
return DaoUtil.toPageData(auditLogRepository.findAll(where(timeSearchSpec).and(fieldsSpec), pageable));
}
private Specification<AuditLogEntity> getEntityFieldsSpec(UUID tenantId, EntityId entityId, CustomerId customerId, UserId userId) {
return (root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
if (tenantId != null) {
Predicate tenantIdPredicate = criteriaBuilder.equal(root.get("tenantId"), UUIDConverter.fromTimeUUID(tenantId));
predicates.add(tenantIdPredicate);
}
if (entityId != null) {
Predicate entityTypePredicate = criteriaBuilder.equal(root.get("entityType"), entityId.getEntityType());
predicates.add(entityTypePredicate);
Predicate entityIdPredicate = criteriaBuilder.equal(root.get("entityId"), UUIDConverter.fromTimeUUID(entityId.getId()));
predicates.add(entityIdPredicate);
}
if (customerId != null) {
Predicate tenantIdPredicate = criteriaBuilder.equal(root.get("customerId"), UUIDConverter.fromTimeUUID(customerId.getId()));
predicates.add(tenantIdPredicate);
}
if (userId != null) {
Predicate tenantIdPredicate = criteriaBuilder.equal(root.get("userId"), UUIDConverter.fromTimeUUID(userId.getId()));
predicates.add(tenantIdPredicate);
}
return criteriaBuilder.and(predicates.toArray(new Predicate[]{}));
};
return DaoUtil.toPageData(
auditLogRepository.findByTenantId(
fromTimeUUID(tenantId),
Objects.toString(pageLink.getTextSearch(), ""),
startTimeToId(pageLink.getStartTime()),
endTimeToId(pageLink.getEndTime()),
DaoUtil.toPageable(pageLink)));
}
}

2
ui-ngx/src/app/modules/home/pages/device/device-tabs.component.html

@ -16,7 +16,7 @@
-->
<mat-tab label="{{entity?.name}}">
Hobotok<br/> {{ test }}
Hobotok<br/>
{{ entity | json }}
</mat-tab>
<mat-tab *ngIf="entity?.additionalInfo?.gateway" label="Gateway">

Loading…
Cancel
Save