diff --git a/application/src/main/java/org/thingsboard/server/controller/AuditLogController.java b/application/src/main/java/org/thingsboard/server/controller/AuditLogController.java index c3ef7f5f17..77e8b43f96 100644 --- a/application/src/main/java/org/thingsboard/server/controller/AuditLogController.java +++ b/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 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); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/audit/AuditLogRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/audit/AuditLogRepository.java index 6a4cc9f72e..bc52512e0f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/audit/AuditLogRepository.java +++ b/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, JpaSpecificationExecutor { +public interface AuditLogRepository extends PagingAndSortingRepository { + + @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 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 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 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 findAuditLogsByTenantIdAndUserId(@Param("tenantId") String tenantId, + @Param("userId") String userId, + @Param("textSearch") String textSearch, + @Param("startId") String startId, + @Param("endId") String endId, + Pageable pageable); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/audit/JpaAuditLogDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/audit/JpaAuditLogDao.java index 91b0a16dd7..8cb2c1f764 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/audit/JpaAuditLogDao.java +++ b/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 imp @Override public PageData 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 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 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 findAuditLogsByTenantId(UUID tenantId, TimePageLink pageLink) { - return findAuditLogs(tenantId, null, null, null, pageLink); - } - - private PageData findAuditLogs(UUID tenantId, EntityId entityId, CustomerId customerId, UserId userId, TimePageLink pageLink) { - Specification timeSearchSpec = JpaAbstractSearchTimeDao.getTimeSearchPageSpec(pageLink, "id"); - Specification fieldsSpec = getEntityFieldsSpec(tenantId, entityId, customerId, userId); - Pageable pageable = DaoUtil.toPageable(pageLink); - return DaoUtil.toPageData(auditLogRepository.findAll(where(timeSearchSpec).and(fieldsSpec), pageable)); - } - - private Specification getEntityFieldsSpec(UUID tenantId, EntityId entityId, CustomerId customerId, UserId userId) { - return (root, criteriaQuery, criteriaBuilder) -> { - List 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))); } } diff --git a/ui-ngx/src/app/modules/home/pages/device/device-tabs.component.html b/ui-ngx/src/app/modules/home/pages/device/device-tabs.component.html index bb8056d55b..8a1c1718ba 100644 --- a/ui-ngx/src/app/modules/home/pages/device/device-tabs.component.html +++ b/ui-ngx/src/app/modules/home/pages/device/device-tabs.component.html @@ -16,7 +16,7 @@ --> - Hobotok
{{ test }} + Hobotok
{{ entity | json }}