Commit c8ec87f41d65063af262ecdf207f97251a4d25aa

Authored by Igor Kulikov
1 parent f8ac02da

Improve audit logs page link

@@ -44,14 +44,15 @@ public class AuditLogController extends BaseController { @@ -44,14 +44,15 @@ public class AuditLogController extends BaseController {
44 @PathVariable("customerId") String strCustomerId, 44 @PathVariable("customerId") String strCustomerId,
45 @RequestParam int pageSize, 45 @RequestParam int pageSize,
46 @RequestParam int page, 46 @RequestParam int page,
  47 + @RequestParam(required = false) String textSearch,
  48 + @RequestParam(required = false) String sortProperty,
  49 + @RequestParam(required = false) String sortOrder,
47 @RequestParam(required = false) Long startTime, 50 @RequestParam(required = false) Long startTime,
48 - @RequestParam(required = false) Long endTime,  
49 - @RequestParam(required = false, defaultValue = "false") boolean ascOrder) throws ThingsboardException { 51 + @RequestParam(required = false) Long endTime) throws ThingsboardException {
50 try { 52 try {
51 checkParameter("CustomerId", strCustomerId); 53 checkParameter("CustomerId", strCustomerId);
52 TenantId tenantId = getCurrentUser().getTenantId(); 54 TenantId tenantId = getCurrentUser().getTenantId();
53 - TimePageLink pageLink = createTimePageLink(pageSize, page, "",  
54 - "createdTime", ascOrder ? "asc" : "desc", startTime, endTime); 55 + TimePageLink pageLink = createTimePageLink(pageSize, page, textSearch, sortProperty, sortOrder, startTime, endTime);
55 return checkNotNull(auditLogService.findAuditLogsByTenantIdAndCustomerId(tenantId, new CustomerId(UUID.fromString(strCustomerId)), pageLink)); 56 return checkNotNull(auditLogService.findAuditLogsByTenantIdAndCustomerId(tenantId, new CustomerId(UUID.fromString(strCustomerId)), pageLink));
56 } catch (Exception e) { 57 } catch (Exception e) {
57 throw handleException(e); 58 throw handleException(e);
@@ -65,15 +66,15 @@ public class AuditLogController extends BaseController { @@ -65,15 +66,15 @@ public class AuditLogController extends BaseController {
65 @PathVariable("userId") String strUserId, 66 @PathVariable("userId") String strUserId,
66 @RequestParam int pageSize, 67 @RequestParam int pageSize,
67 @RequestParam int page, 68 @RequestParam int page,
  69 + @RequestParam(required = false) String textSearch,
  70 + @RequestParam(required = false) String sortProperty,
  71 + @RequestParam(required = false) String sortOrder,
68 @RequestParam(required = false) Long startTime, 72 @RequestParam(required = false) Long startTime,
69 - @RequestParam(required = false) Long endTime,  
70 - @RequestParam(required = false, defaultValue = "false") boolean ascOrder) throws ThingsboardException { 73 + @RequestParam(required = false) Long endTime) throws ThingsboardException {
71 try { 74 try {
72 checkParameter("UserId", strUserId); 75 checkParameter("UserId", strUserId);
73 TenantId tenantId = getCurrentUser().getTenantId(); 76 TenantId tenantId = getCurrentUser().getTenantId();
74 - TimePageLink pageLink = createTimePageLink(pageSize, page, "",  
75 - "createdTime", ascOrder ? "asc" : "desc", startTime, endTime);  
76 - return checkNotNull(auditLogService.findAuditLogsByTenantIdAndUserId(tenantId, new UserId(UUID.fromString(strUserId)), pageLink)); 77 + TimePageLink pageLink = createTimePageLink(pageSize, page, textSearch, sortProperty, sortOrder, startTime, endTime); return checkNotNull(auditLogService.findAuditLogsByTenantIdAndUserId(tenantId, new UserId(UUID.fromString(strUserId)), pageLink));
77 } catch (Exception e) { 78 } catch (Exception e) {
78 throw handleException(e); 79 throw handleException(e);
79 } 80 }
@@ -87,16 +88,16 @@ public class AuditLogController extends BaseController { @@ -87,16 +88,16 @@ public class AuditLogController extends BaseController {
87 @PathVariable("entityId") String strEntityId, 88 @PathVariable("entityId") String strEntityId,
88 @RequestParam int pageSize, 89 @RequestParam int pageSize,
89 @RequestParam int page, 90 @RequestParam int page,
  91 + @RequestParam(required = false) String textSearch,
  92 + @RequestParam(required = false) String sortProperty,
  93 + @RequestParam(required = false) String sortOrder,
90 @RequestParam(required = false) Long startTime, 94 @RequestParam(required = false) Long startTime,
91 - @RequestParam(required = false) Long endTime,  
92 - @RequestParam(required = false, defaultValue = "false") boolean ascOrder) throws ThingsboardException { 95 + @RequestParam(required = false) Long endTime) throws ThingsboardException {
93 try { 96 try {
94 checkParameter("EntityId", strEntityId); 97 checkParameter("EntityId", strEntityId);
95 checkParameter("EntityType", strEntityType); 98 checkParameter("EntityType", strEntityType);
96 TenantId tenantId = getCurrentUser().getTenantId(); 99 TenantId tenantId = getCurrentUser().getTenantId();
97 - TimePageLink pageLink = createTimePageLink(pageSize, page, "",  
98 - "createdTime", ascOrder ? "asc" : "desc", startTime, endTime);  
99 - return checkNotNull(auditLogService.findAuditLogsByTenantIdAndEntityId(tenantId, EntityIdFactory.getByTypeAndId(strEntityType, strEntityId), pageLink)); 100 + TimePageLink pageLink = createTimePageLink(pageSize, page, textSearch, sortProperty, sortOrder, startTime, endTime); return checkNotNull(auditLogService.findAuditLogsByTenantIdAndEntityId(tenantId, EntityIdFactory.getByTypeAndId(strEntityType, strEntityId), pageLink));
100 } catch (Exception e) { 101 } catch (Exception e) {
101 throw handleException(e); 102 throw handleException(e);
102 } 103 }
@@ -108,13 +109,14 @@ public class AuditLogController extends BaseController { @@ -108,13 +109,14 @@ public class AuditLogController extends BaseController {
108 public PageData<AuditLog> getAuditLogs( 109 public PageData<AuditLog> getAuditLogs(
109 @RequestParam int pageSize, 110 @RequestParam int pageSize,
110 @RequestParam int page, 111 @RequestParam int page,
  112 + @RequestParam(required = false) String textSearch,
  113 + @RequestParam(required = false) String sortProperty,
  114 + @RequestParam(required = false) String sortOrder,
111 @RequestParam(required = false) Long startTime, 115 @RequestParam(required = false) Long startTime,
112 - @RequestParam(required = false) Long endTime,  
113 - @RequestParam(required = false, defaultValue = "false") boolean ascOrder) throws ThingsboardException { 116 + @RequestParam(required = false) Long endTime) throws ThingsboardException {
114 try { 117 try {
115 TenantId tenantId = getCurrentUser().getTenantId(); 118 TenantId tenantId = getCurrentUser().getTenantId();
116 - TimePageLink pageLink = createTimePageLink(pageSize, page, "",  
117 - "createdTime", ascOrder ? "asc" : "desc", startTime, endTime); 119 + TimePageLink pageLink = createTimePageLink(pageSize, page, textSearch, sortProperty, sortOrder, startTime, endTime);
118 return checkNotNull(auditLogService.findAuditLogsByTenantId(tenantId, pageLink)); 120 return checkNotNull(auditLogService.findAuditLogsByTenantId(tenantId, pageLink));
119 } catch (Exception e) { 121 } catch (Exception e) {
120 throw handleException(e); 122 throw handleException(e);
@@ -15,10 +15,84 @@ @@ -15,10 +15,84 @@
15 */ 15 */
16 package org.thingsboard.server.dao.sql.audit; 16 package org.thingsboard.server.dao.sql.audit;
17 17
18 -import org.springframework.data.jpa.repository.JpaSpecificationExecutor;  
19 -import org.springframework.data.repository.CrudRepository; 18 +import org.springframework.data.domain.Page;
  19 +import org.springframework.data.domain.Pageable;
  20 +import org.springframework.data.jpa.repository.Query;
  21 +import org.springframework.data.repository.PagingAndSortingRepository;
  22 +import org.springframework.data.repository.query.Param;
  23 +import org.thingsboard.server.common.data.EntityType;
20 import org.thingsboard.server.dao.model.sql.AuditLogEntity; 24 import org.thingsboard.server.dao.model.sql.AuditLogEntity;
21 25
22 -public interface AuditLogRepository extends CrudRepository<AuditLogEntity, String>, JpaSpecificationExecutor<AuditLogEntity> { 26 +public interface AuditLogRepository extends PagingAndSortingRepository<AuditLogEntity, String> {
  27 +
  28 + @Query("SELECT a FROM AuditLogEntity a WHERE " +
  29 + "a.tenantId = :tenantId " +
  30 + "AND (:startId IS NULL OR a.id >= :startId) " +
  31 + "AND (:endId IS NULL OR a.id <= :endId) " +
  32 + "AND (LOWER(a.entityType) LIKE LOWER(CONCAT(:textSearch, '%'))" +
  33 + "OR LOWER(a.entityName) LIKE LOWER(CONCAT(:textSearch, '%'))" +
  34 + "OR LOWER(a.userName) LIKE LOWER(CONCAT(:textSearch, '%'))" +
  35 + "OR LOWER(a.actionType) LIKE LOWER(CONCAT(:textSearch, '%'))" +
  36 + "OR LOWER(a.actionStatus) LIKE LOWER(CONCAT(:textSearch, '%')))"
  37 + )
  38 + Page<AuditLogEntity> findByTenantId(
  39 + @Param("tenantId") String tenantId,
  40 + @Param("textSearch") String textSearch,
  41 + @Param("startId") String startId,
  42 + @Param("endId") String endId,
  43 + Pageable pageable);
  44 +
  45 + @Query("SELECT a FROM AuditLogEntity a WHERE " +
  46 + "a.tenantId = :tenantId " +
  47 + "AND a.entityType = :entityType AND a.entityId = :entityId " +
  48 + "AND (:startId IS NULL OR a.id >= :startId) " +
  49 + "AND (:endId IS NULL OR a.id <= :endId) " +
  50 + "AND (LOWER(a.entityName) LIKE LOWER(CONCAT(:textSearch, '%'))" +
  51 + "OR LOWER(a.userName) LIKE LOWER(CONCAT(:textSearch, '%'))" +
  52 + "OR LOWER(a.actionType) LIKE LOWER(CONCAT(:textSearch, '%'))" +
  53 + "OR LOWER(a.actionStatus) LIKE LOWER(CONCAT(:textSearch, '%')))"
  54 + )
  55 + Page<AuditLogEntity> findAuditLogsByTenantIdAndEntityId(@Param("tenantId") String tenantId,
  56 + @Param("entityType") EntityType entityType,
  57 + @Param("entityId") String entityId,
  58 + @Param("textSearch") String textSearch,
  59 + @Param("startId") String startId,
  60 + @Param("endId") String endId,
  61 + Pageable pageable);
  62 +
  63 + @Query("SELECT a FROM AuditLogEntity a WHERE " +
  64 + "a.tenantId = :tenantId " +
  65 + "AND a.customerId = :customerId " +
  66 + "AND (:startId IS NULL OR a.id >= :startId) " +
  67 + "AND (:endId IS NULL OR a.id <= :endId) " +
  68 + "AND (LOWER(a.entityType) LIKE LOWER(CONCAT(:textSearch, '%'))" +
  69 + "OR LOWER(a.entityName) LIKE LOWER(CONCAT(:textSearch, '%'))" +
  70 + "OR LOWER(a.userName) LIKE LOWER(CONCAT(:textSearch, '%'))" +
  71 + "OR LOWER(a.actionType) LIKE LOWER(CONCAT(:textSearch, '%'))" +
  72 + "OR LOWER(a.actionStatus) LIKE LOWER(CONCAT(:textSearch, '%')))"
  73 + )
  74 + Page<AuditLogEntity> findAuditLogsByTenantIdAndCustomerId(@Param("tenantId") String tenantId,
  75 + @Param("customerId") String customerId,
  76 + @Param("textSearch") String textSearch,
  77 + @Param("startId") String startId,
  78 + @Param("endId") String endId,
  79 + Pageable pageable);
  80 +
  81 + @Query("SELECT a FROM AuditLogEntity a WHERE " +
  82 + "a.tenantId = :tenantId " +
  83 + "AND a.userId = :userId " +
  84 + "AND (:startId IS NULL OR a.id >= :startId) " +
  85 + "AND (:endId IS NULL OR a.id <= :endId) " +
  86 + "AND (LOWER(a.entityType) LIKE LOWER(CONCAT(:textSearch, '%'))" +
  87 + "OR LOWER(a.entityName) LIKE LOWER(CONCAT(:textSearch, '%'))" +
  88 + "OR LOWER(a.actionType) LIKE LOWER(CONCAT(:textSearch, '%'))" +
  89 + "OR LOWER(a.actionStatus) LIKE LOWER(CONCAT(:textSearch, '%')))"
  90 + )
  91 + Page<AuditLogEntity> findAuditLogsByTenantIdAndUserId(@Param("tenantId") String tenantId,
  92 + @Param("userId") String userId,
  93 + @Param("textSearch") String textSearch,
  94 + @Param("startId") String startId,
  95 + @Param("endId") String endId,
  96 + Pageable pageable);
23 97
24 } 98 }
@@ -19,13 +19,8 @@ import com.google.common.util.concurrent.ListenableFuture; @@ -19,13 +19,8 @@ import com.google.common.util.concurrent.ListenableFuture;
19 import com.google.common.util.concurrent.ListeningExecutorService; 19 import com.google.common.util.concurrent.ListeningExecutorService;
20 import com.google.common.util.concurrent.MoreExecutors; 20 import com.google.common.util.concurrent.MoreExecutors;
21 import org.springframework.beans.factory.annotation.Autowired; 21 import org.springframework.beans.factory.annotation.Autowired;
22 -import org.springframework.data.domain.PageRequest;  
23 -import org.springframework.data.domain.Pageable;  
24 -import org.springframework.data.domain.Sort;  
25 -import org.springframework.data.jpa.domain.Specification;  
26 import org.springframework.data.repository.CrudRepository; 22 import org.springframework.data.repository.CrudRepository;
27 import org.springframework.stereotype.Component; 23 import org.springframework.stereotype.Component;
28 -import org.thingsboard.server.common.data.UUIDConverter;  
29 import org.thingsboard.server.common.data.audit.AuditLog; 24 import org.thingsboard.server.common.data.audit.AuditLog;
30 import org.thingsboard.server.common.data.id.CustomerId; 25 import org.thingsboard.server.common.data.id.CustomerId;
31 import org.thingsboard.server.common.data.id.EntityId; 26 import org.thingsboard.server.common.data.id.EntityId;
@@ -36,18 +31,16 @@ import org.thingsboard.server.dao.DaoUtil; @@ -36,18 +31,16 @@ import org.thingsboard.server.dao.DaoUtil;
36 import org.thingsboard.server.dao.audit.AuditLogDao; 31 import org.thingsboard.server.dao.audit.AuditLogDao;
37 import org.thingsboard.server.dao.model.sql.AuditLogEntity; 32 import org.thingsboard.server.dao.model.sql.AuditLogEntity;
38 import org.thingsboard.server.dao.sql.JpaAbstractDao; 33 import org.thingsboard.server.dao.sql.JpaAbstractDao;
39 -import org.thingsboard.server.dao.sql.JpaAbstractSearchTimeDao;  
40 import org.thingsboard.server.dao.util.SqlDao; 34 import org.thingsboard.server.dao.util.SqlDao;
41 35
42 import javax.annotation.PreDestroy; 36 import javax.annotation.PreDestroy;
43 -import javax.persistence.criteria.Predicate;  
44 -import java.util.ArrayList;  
45 -import java.util.List; 37 +import java.util.Objects;
46 import java.util.UUID; 38 import java.util.UUID;
47 import java.util.concurrent.Executors; 39 import java.util.concurrent.Executors;
48 40
49 -import static org.springframework.data.jpa.domain.Specifications.where;  
50 -import static org.thingsboard.server.dao.model.ModelConstants.ID_PROPERTY; 41 +import static org.thingsboard.server.common.data.UUIDConverter.fromTimeUUID;
  42 +import static org.thingsboard.server.dao.DaoUtil.endTimeToId;
  43 +import static org.thingsboard.server.dao.DaoUtil.startTimeToId;
51 44
52 @Component 45 @Component
53 @SqlDao 46 @SqlDao
@@ -83,53 +76,52 @@ public class JpaAuditLogDao extends JpaAbstractDao<AuditLogEntity, AuditLog> imp @@ -83,53 +76,52 @@ public class JpaAuditLogDao extends JpaAbstractDao<AuditLogEntity, AuditLog> imp
83 76
84 @Override 77 @Override
85 public PageData<AuditLog> findAuditLogsByTenantIdAndEntityId(UUID tenantId, EntityId entityId, TimePageLink pageLink) { 78 public PageData<AuditLog> findAuditLogsByTenantIdAndEntityId(UUID tenantId, EntityId entityId, TimePageLink pageLink) {
86 - return findAuditLogs(tenantId, entityId, null, null, pageLink); 79 + return DaoUtil.toPageData(
  80 + auditLogRepository
  81 + .findAuditLogsByTenantIdAndEntityId(
  82 + fromTimeUUID(tenantId),
  83 + entityId.getEntityType(),
  84 + fromTimeUUID(entityId.getId()),
  85 + Objects.toString(pageLink.getTextSearch(), ""),
  86 + startTimeToId(pageLink.getStartTime()),
  87 + endTimeToId(pageLink.getEndTime()),
  88 + DaoUtil.toPageable(pageLink)));
87 } 89 }
88 90
89 @Override 91 @Override
90 public PageData<AuditLog> findAuditLogsByTenantIdAndCustomerId(UUID tenantId, CustomerId customerId, TimePageLink pageLink) { 92 public PageData<AuditLog> findAuditLogsByTenantIdAndCustomerId(UUID tenantId, CustomerId customerId, TimePageLink pageLink) {
91 - return findAuditLogs(tenantId, null, customerId, null, pageLink); 93 + return DaoUtil.toPageData(
  94 + auditLogRepository
  95 + .findAuditLogsByTenantIdAndCustomerId(
  96 + fromTimeUUID(tenantId),
  97 + fromTimeUUID(customerId.getId()),
  98 + Objects.toString(pageLink.getTextSearch(), ""),
  99 + startTimeToId(pageLink.getStartTime()),
  100 + endTimeToId(pageLink.getEndTime()),
  101 + DaoUtil.toPageable(pageLink)));
92 } 102 }
93 103
94 @Override 104 @Override
95 public PageData<AuditLog> findAuditLogsByTenantIdAndUserId(UUID tenantId, UserId userId, TimePageLink pageLink) { 105 public PageData<AuditLog> findAuditLogsByTenantIdAndUserId(UUID tenantId, UserId userId, TimePageLink pageLink) {
96 - return findAuditLogs(tenantId, null, null, userId, pageLink); 106 + return DaoUtil.toPageData(
  107 + auditLogRepository
  108 + .findAuditLogsByTenantIdAndUserId(
  109 + fromTimeUUID(tenantId),
  110 + fromTimeUUID(userId.getId()),
  111 + Objects.toString(pageLink.getTextSearch(), ""),
  112 + startTimeToId(pageLink.getStartTime()),
  113 + endTimeToId(pageLink.getEndTime()),
  114 + DaoUtil.toPageable(pageLink)));
97 } 115 }
98 116
99 @Override 117 @Override
100 public PageData<AuditLog> findAuditLogsByTenantId(UUID tenantId, TimePageLink pageLink) { 118 public PageData<AuditLog> findAuditLogsByTenantId(UUID tenantId, TimePageLink pageLink) {
101 - return findAuditLogs(tenantId, null, null, null, pageLink);  
102 - }  
103 -  
104 - private PageData<AuditLog> findAuditLogs(UUID tenantId, EntityId entityId, CustomerId customerId, UserId userId, TimePageLink pageLink) {  
105 - Specification<AuditLogEntity> timeSearchSpec = JpaAbstractSearchTimeDao.getTimeSearchPageSpec(pageLink, "id");  
106 - Specification<AuditLogEntity> fieldsSpec = getEntityFieldsSpec(tenantId, entityId, customerId, userId);  
107 - Pageable pageable = DaoUtil.toPageable(pageLink);  
108 - return DaoUtil.toPageData(auditLogRepository.findAll(where(timeSearchSpec).and(fieldsSpec), pageable));  
109 - }  
110 -  
111 - private Specification<AuditLogEntity> getEntityFieldsSpec(UUID tenantId, EntityId entityId, CustomerId customerId, UserId userId) {  
112 - return (root, criteriaQuery, criteriaBuilder) -> {  
113 - List<Predicate> predicates = new ArrayList<>();  
114 - if (tenantId != null) {  
115 - Predicate tenantIdPredicate = criteriaBuilder.equal(root.get("tenantId"), UUIDConverter.fromTimeUUID(tenantId));  
116 - predicates.add(tenantIdPredicate);  
117 - }  
118 - if (entityId != null) {  
119 - Predicate entityTypePredicate = criteriaBuilder.equal(root.get("entityType"), entityId.getEntityType());  
120 - predicates.add(entityTypePredicate);  
121 - Predicate entityIdPredicate = criteriaBuilder.equal(root.get("entityId"), UUIDConverter.fromTimeUUID(entityId.getId()));  
122 - predicates.add(entityIdPredicate);  
123 - }  
124 - if (customerId != null) {  
125 - Predicate tenantIdPredicate = criteriaBuilder.equal(root.get("customerId"), UUIDConverter.fromTimeUUID(customerId.getId()));  
126 - predicates.add(tenantIdPredicate);  
127 - }  
128 - if (userId != null) {  
129 - Predicate tenantIdPredicate = criteriaBuilder.equal(root.get("userId"), UUIDConverter.fromTimeUUID(userId.getId()));  
130 - predicates.add(tenantIdPredicate);  
131 - }  
132 - return criteriaBuilder.and(predicates.toArray(new Predicate[]{}));  
133 - }; 119 + return DaoUtil.toPageData(
  120 + auditLogRepository.findByTenantId(
  121 + fromTimeUUID(tenantId),
  122 + Objects.toString(pageLink.getTextSearch(), ""),
  123 + startTimeToId(pageLink.getStartTime()),
  124 + endTimeToId(pageLink.getEndTime()),
  125 + DaoUtil.toPageable(pageLink)));
134 } 126 }
135 } 127 }
@@ -16,7 +16,7 @@ @@ -16,7 +16,7 @@
16 16
17 --> 17 -->
18 <mat-tab label="{{entity?.name}}"> 18 <mat-tab label="{{entity?.name}}">
19 - Hobotok<br/> {{ test }} 19 + Hobotok<br/>
20 {{ entity | json }} 20 {{ entity | json }}
21 </mat-tab> 21 </mat-tab>
22 <mat-tab *ngIf="entity?.additionalInfo?.gateway" label="Gateway"> 22 <mat-tab *ngIf="entity?.additionalInfo?.gateway" label="Gateway">