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