This is an automated email from the ASF dual-hosted git repository.

ofuks pushed a commit to branch audit
in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git


The following commit(s) were added to refs/heads/audit by this push:
     new 815daaa  Added pagination and filtering for audit records
815daaa is described below

commit 815daaa3e049257c7f986395d0dcdf7f0430ee1f
Author: Oleh Fuks <olegfuk...@gmail.com>
AuthorDate: Fri Jun 19 13:39:33 2020 +0300

    Added pagination and filtering for audit records
---
 .../main/java/com/epam/dlab/model/StringList.java} | 32 ++++---
 services/self-service/pom.xml                      |  6 ++
 .../com/epam/dlab/backendapi/dao/AuditDAO.java     |  3 +-
 .../com/epam/dlab/backendapi/dao/AuditDAOImpl.java | 97 +++++++++++++++++++++-
 .../java/com/epam/dlab/backendapi/dao/BaseDAO.java | 18 ----
 .../AuditPaginationDTO.java}                       | 16 ++--
 .../dlab/backendapi/resources/AuditResource.java   | 13 ++-
 .../epam/dlab/backendapi/service/AuditService.java |  3 +-
 .../backendapi/service/impl/AuditServiceImpl.java  |  5 +-
 9 files changed, 148 insertions(+), 45 deletions(-)

diff --git 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/AuditDAOImpl.java
 b/services/dlab-model/src/main/java/com/epam/dlab/model/StringList.java
similarity index 58%
copy from 
services/self-service/src/main/java/com/epam/dlab/backendapi/dao/AuditDAOImpl.java
copy to services/dlab-model/src/main/java/com/epam/dlab/model/StringList.java
index ee90efa..d02ad3c 100644
--- 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/AuditDAOImpl.java
+++ b/services/dlab-model/src/main/java/com/epam/dlab/model/StringList.java
@@ -17,22 +17,28 @@
  * under the License.
  */
 
-package com.epam.dlab.backendapi.dao;
+package com.epam.dlab.model;
 
-import com.epam.dlab.backendapi.domain.AuditDTO;
+import javax.ws.rs.WebApplicationException;
+import java.util.ArrayList;
 
-import java.util.List;
+public class StringList extends ArrayList<String> {
+    public StringList(String s) {
+        super();
 
-public class AuditDAOImpl extends BaseDAO implements AuditDAO {
-    private final static String AUDIT_COLLECTION = "audit";
-
-    @Override
-    public void save(AuditDTO audit) {
-        insertOne(AUDIT_COLLECTION, audit);
+        for (String v : s.split(",")) {
+            try {
+                add(v.trim());
+            } catch (Exception ex) {
+                ex.printStackTrace();
+                throw new WebApplicationException(400);
+            }
+        }
+        if (isEmpty())
+            throw new WebApplicationException(400);
     }
 
-    @Override
-    public List<AuditDTO> getAudit(int pageNumber, int pageSize) {
-        return find(AUDIT_COLLECTION, pageNumber, pageSize, AuditDTO.class);
+    public static String valueOf(String s) {
+        return s;
     }
-}
+}
\ No newline at end of file
diff --git a/services/self-service/pom.xml b/services/self-service/pom.xml
index f21caf9..9ea6a9a 100644
--- a/services/self-service/pom.xml
+++ b/services/self-service/pom.xml
@@ -54,6 +54,12 @@
             <groupId>com.novemberain</groupId>
             <artifactId>quartz-mongodb</artifactId>
             <version>2.1.0</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.mongodb</groupId>
+                    <artifactId>mongodb-driver</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>com.epam.dlab</groupId>
diff --git 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/AuditDAO.java
 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/AuditDAO.java
index 23da384..edc1f50 100644
--- 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/AuditDAO.java
+++ 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/AuditDAO.java
@@ -20,11 +20,12 @@
 package com.epam.dlab.backendapi.dao;
 
 import com.epam.dlab.backendapi.domain.AuditDTO;
+import com.epam.dlab.backendapi.domain.AuditPaginationDTO;
 
 import java.util.List;
 
 public interface AuditDAO {
     void save(AuditDTO audit);
 
-    List<AuditDTO> getAudit(int pageNumber, int pageSize);
+    List<AuditPaginationDTO> getAudit(List<String> users, List<String> 
projects, List<String> resourceNames, String dateStart, String dateEnd, int 
pageNumber, int pageSize);
 }
diff --git 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/AuditDAOImpl.java
 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/AuditDAOImpl.java
index ee90efa..8094997 100644
--- 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/AuditDAOImpl.java
+++ 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/AuditDAOImpl.java
@@ -20,11 +20,45 @@
 package com.epam.dlab.backendapi.dao;
 
 import com.epam.dlab.backendapi.domain.AuditDTO;
+import com.epam.dlab.backendapi.domain.AuditPaginationDTO;
+import com.epam.dlab.exceptions.DlabException;
+import com.mongodb.client.model.Facet;
+import com.mongodb.client.model.Filters;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.bson.Document;
+import org.bson.conversions.Bson;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.ZoneOffset;
+import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
+import java.util.TimeZone;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
+
+import static com.epam.dlab.backendapi.dao.ComputationalDAO.PROJECT;
+import static com.mongodb.client.model.Aggregates.count;
+import static com.mongodb.client.model.Aggregates.facet;
+import static com.mongodb.client.model.Aggregates.limit;
+import static com.mongodb.client.model.Aggregates.match;
+import static com.mongodb.client.model.Aggregates.skip;
+import static com.mongodb.client.model.Filters.gte;
+import static com.mongodb.client.model.Filters.in;
+import static com.mongodb.client.model.Filters.lte;
 
 public class AuditDAOImpl extends BaseDAO implements AuditDAO {
     private final static String AUDIT_COLLECTION = "audit";
+    private static final String RESOURCE_NAME_FIELD = "resourceName";
+    private static final String TIMESTAMP_FIELD = "timestamp";
+    private static final String COUNT_FIELD = "count";
+    private static final String AUDIT_FACET = "audit";
+    private static final String TOTAL_COUNT_FACET = "totalCount";
 
     @Override
     public void save(AuditDTO audit) {
@@ -32,7 +66,66 @@ public class AuditDAOImpl extends BaseDAO implements 
AuditDAO {
     }
 
     @Override
-    public List<AuditDTO> getAudit(int pageNumber, int pageSize) {
-        return find(AUDIT_COLLECTION, pageNumber, pageSize, AuditDTO.class);
+    public List<AuditPaginationDTO> getAudit(List<String> users, List<String> 
projects, List<String> resourceNames, String dateStart, String dateEnd,
+                                             int pageNumber, int pageSize) {
+        List<Bson> valuesPipeline = new ArrayList<>();
+        List<Bson> countPipeline = new ArrayList<>();
+        List<Bson> matchCriteria = matchCriteria(users, projects, 
resourceNames, dateStart, dateEnd);
+        if (!matchCriteria.isEmpty()) {
+            Bson match = match(Filters.and(matchCriteria));
+            valuesPipeline.add(match);
+            countPipeline.add(match);
+        }
+        countPipeline.add(count());
+        valuesPipeline.addAll(Arrays.asList(skip(pageSize * (pageNumber - 1)), 
limit(pageSize)));
+
+        List<Bson> facets = Collections.singletonList(facet(new 
Facet(AUDIT_FACET, valuesPipeline), new Facet(TOTAL_COUNT_FACET, 
countPipeline)));
+        return StreamSupport.stream(aggregate(AUDIT_COLLECTION, 
facets).spliterator(), false)
+                .map(this::toAuditDTO)
+                .collect(Collectors.toList());
+    }
+
+    private List<Bson> matchCriteria(List<String> users, List<String> 
projects, List<String> resourceNames, String dateStart, String dateEnd) {
+        List<Bson> searchCriteria = new ArrayList<>();
+        inCriteria(searchCriteria, users, USER);
+        inCriteria(searchCriteria, projects, PROJECT);
+        inCriteria(searchCriteria, resourceNames, RESOURCE_NAME_FIELD);
+        if (StringUtils.isNotEmpty(dateStart)) {
+            Instant from = getInstant(dateStart);
+            searchCriteria.add(gte(TIMESTAMP_FIELD, from));
+        }
+        if (StringUtils.isNotEmpty(dateEnd)) {
+            Instant to = getInstant(dateEnd).plus(1, ChronoUnit.DAYS);
+            searchCriteria.add(lte(TIMESTAMP_FIELD, to));
+        }
+        return searchCriteria;
+    }
+
+    private AuditPaginationDTO toAuditDTO(Document document) {
+        List<Document> documents = (List<Document>) 
(document.get(TOTAL_COUNT_FACET));
+        final int count = documents.isEmpty() ? 0 : 
documents.get(0).getInteger(COUNT_FIELD);
+        List<AuditDTO> auditDTOs = (List<AuditDTO>) document.get(AUDIT_FACET);
+        return AuditPaginationDTO.builder()
+                .totalPageCount(count)
+                .audit(auditDTOs)
+                .build();
+    }
+
+    private Instant getInstant(String dateStart) {
+        Instant from;
+        try {
+            SimpleDateFormat simpleDateFormat = new 
SimpleDateFormat("yyyy-MM-dd");
+            simpleDateFormat.setTimeZone(TimeZone.getTimeZone(ZoneOffset.UTC));
+            from = simpleDateFormat.parse(dateStart).toInstant();
+        } catch (ParseException e) {
+            throw new DlabException(String.format("Cannot parse %s", 
dateStart), e);
+        }
+        return from;
+    }
+
+    private void inCriteria(List<Bson> searchCriteria, List<String> users, 
String user) {
+        if (CollectionUtils.isNotEmpty(users)) {
+            searchCriteria.add(in(user, users));
+        }
     }
 }
diff --git 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BaseDAO.java 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BaseDAO.java
index bdf88cc..96532a5 100644
--- 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BaseDAO.java
+++ 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BaseDAO.java
@@ -317,24 +317,6 @@ public class BaseDAO {
        }
 
        /**
-        * Finds and returns all documents from the collection converted to 
resulted type with pagination.
-        *
-        * @param collection    collection name.
-        * @param pageNumber    page number
-        * @param pageSize      size of page
-        * @param resultedClass type of class for deserialization.
-        */
-       protected <T> List<T> find(String collection, int pageNumber, int 
pageSize, Class<T> resultedClass) {
-               return find(collection)
-                               .skip(pageSize * (pageNumber - 1))
-                               .limit(pageSize)
-                               .into(new ArrayList<>())
-                               .stream()
-                               .map(d -> convertFromDocument(d, resultedClass))
-                               .collect(Collectors.toList());
-       }
-
-       /**
         * Finds and returns documents from the collection by condition.
         *
         * @param collection    collection name.
diff --git 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/AuditDAO.java
 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditPaginationDTO.java
similarity index 73%
copy from 
services/self-service/src/main/java/com/epam/dlab/backendapi/dao/AuditDAO.java
copy to 
services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditPaginationDTO.java
index 23da384..71cfe8d 100644
--- 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/AuditDAO.java
+++ 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/AuditPaginationDTO.java
@@ -17,14 +17,18 @@
  * under the License.
  */
 
-package com.epam.dlab.backendapi.dao;
+package com.epam.dlab.backendapi.domain;
 
-import com.epam.dlab.backendapi.domain.AuditDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Data;
 
 import java.util.List;
 
-public interface AuditDAO {
-    void save(AuditDTO audit);
-
-    List<AuditDTO> getAudit(int pageNumber, int pageSize);
+@Data
+@Builder
+public class AuditPaginationDTO {
+    @JsonProperty("page-count")
+    private final int totalPageCount;
+    private final List<AuditDTO> audit;
 }
diff --git 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/AuditResource.java
 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/AuditResource.java
index 2e5bba3..c08350e 100644
--- 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/AuditResource.java
+++ 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/AuditResource.java
@@ -22,6 +22,7 @@ package com.epam.dlab.backendapi.resources;
 import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.backendapi.domain.AuditCreateDTO;
 import com.epam.dlab.backendapi.service.AuditService;
+import com.epam.dlab.model.StringList;
 import com.google.inject.Inject;
 import io.dropwizard.auth.Auth;
 
@@ -53,8 +54,16 @@ public class AuditResource {
 
     @GET
     @Produces(MediaType.APPLICATION_JSON)
-    public Response getAudit(@Auth UserInfo userInfo, 
@QueryParam("page-number") int pageNumber,
+    public Response getAudit(@Auth UserInfo userInfo,
+                             @QueryParam("users") StringList users,
+                             @QueryParam("projects") StringList projects,
+                             @QueryParam("resource-names") StringList 
resourceNames,
+                             @QueryParam("date-start") String dateStart,
+                             @QueryParam("date-end") String dateEnd,
+                             @QueryParam("page-number") int pageNumber,
                              @QueryParam("page-size") int pageSize) {
-        return Response.ok(auditService.getAudit(pageNumber, 
pageSize)).build();
+        return Response
+                .ok(auditService.getAudit(users, projects, resourceNames, 
dateStart, dateEnd, pageNumber, pageSize))
+                .build();
     }
 }
diff --git 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/AuditService.java
 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/AuditService.java
index 6b9c3a9..8ea9afd 100644
--- 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/AuditService.java
+++ 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/AuditService.java
@@ -21,6 +21,7 @@ package com.epam.dlab.backendapi.service;
 
 import com.epam.dlab.backendapi.domain.AuditCreateDTO;
 import com.epam.dlab.backendapi.domain.AuditDTO;
+import com.epam.dlab.backendapi.domain.AuditPaginationDTO;
 
 import java.util.List;
 
@@ -29,5 +30,5 @@ public interface AuditService {
 
     void save(String user, AuditCreateDTO audit);
 
-    List<AuditDTO> getAudit(int pageNumber, int pageSize);
+    List<AuditPaginationDTO> getAudit(List<String> users, List<String> 
projects, List<String> resourceNames, String dateStart, String dateEnd, int 
pageNumber, int pageSize);
 }
diff --git 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/AuditServiceImpl.java
 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/AuditServiceImpl.java
index 060bbf3..9db06da 100644
--- 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/AuditServiceImpl.java
+++ 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/AuditServiceImpl.java
@@ -23,6 +23,7 @@ import com.epam.dlab.backendapi.dao.AuditDAO;
 import com.epam.dlab.backendapi.domain.AuditActionEnum;
 import com.epam.dlab.backendapi.domain.AuditCreateDTO;
 import com.epam.dlab.backendapi.domain.AuditDTO;
+import com.epam.dlab.backendapi.domain.AuditPaginationDTO;
 import com.epam.dlab.backendapi.service.AuditService;
 import com.google.inject.Inject;
 
@@ -54,7 +55,7 @@ public class AuditServiceImpl implements AuditService {
     }
 
     @Override
-    public List<AuditDTO> getAudit(int pageNumber, int pageSize) {
-        return auditDAO.getAudit(pageNumber, pageSize);
+    public List<AuditPaginationDTO> getAudit(List<String> users, List<String> 
projects, List<String> resourceNames, String dateStart, String dateEnd, int 
pageNumber, int pageSize) {
+        return auditDAO.getAudit(users, projects, resourceNames, dateStart, 
dateEnd, pageNumber, pageSize);
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@dlab.apache.org
For additional commands, e-mail: commits-h...@dlab.apache.org

Reply via email to