Implemented sorting on Action logs and standardized filtering/pagination mechanics

This commit is contained in:
Francesco
2023-09-30 11:22:56 +02:00
parent 6e2cb29f82
commit fa51f11109
12 changed files with 190 additions and 63 deletions

View File

@@ -33,6 +33,7 @@ import tech.ailef.dbadmin.external.dbmapping.DbAdminRepository;
import tech.ailef.dbadmin.external.dbmapping.DbObject;
import tech.ailef.dbadmin.external.dbmapping.DbObjectSchema;
import tech.ailef.dbadmin.external.dto.CompareOperator;
import tech.ailef.dbadmin.external.dto.FacetedSearchRequest;
import tech.ailef.dbadmin.external.dto.LogsSearchRequest;
import tech.ailef.dbadmin.external.dto.PaginatedResult;
import tech.ailef.dbadmin.external.dto.QueryFilter;
@@ -140,7 +141,8 @@ public class DefaultDbAdminController {
queryFilters.removeIf(f -> f.equals(toRemove));
}
MultiValueMap<String, String> parameterMap = Utils.computeParams(queryFilters);
FacetedSearchRequest filterRequest = new FacetedSearchRequest(queryFilters);
MultiValueMap<String, String> parameterMap = filterRequest.computeParams();
MultiValueMap<String, String> filteredParams = new LinkedMultiValueMap<>();
request.getParameterMap().entrySet().stream()
@@ -437,12 +439,7 @@ public class DefaultDbAdminController {
model.addAttribute("activePage", "logs");
model.addAttribute(
"page",
userActionService.findActions(
searchRequest.getTable(),
searchRequest.getActionType(),
searchRequest.getItemId(),
searchRequest.toPageRequest()
)
userActionService.findActions(searchRequest)
);
model.addAttribute("schemas", dbAdmin.getSchemas());
model.addAttribute("searchRequest", searchRequest);

View File

@@ -3,7 +3,6 @@ package tech.ailef.dbadmin.external.dbmapping;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -21,6 +20,7 @@ import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import tech.ailef.dbadmin.external.dto.FacetedSearchRequest;
import tech.ailef.dbadmin.external.dto.PaginatedResult;
import tech.ailef.dbadmin.external.dto.PaginationInfo;
import tech.ailef.dbadmin.external.dto.QueryFilter;
@@ -118,7 +118,7 @@ public class DbAdminRepository {
return new PaginatedResult<DbObject>(
new PaginationInfo(page, maxPage, pageSize, maxElement, null, new HashSet<>()),
new PaginationInfo(page, maxPage, pageSize, maxElement, null, null),
results
);
}
@@ -231,7 +231,7 @@ public class DbAdminRepository {
}
return new PaginatedResult<DbObject>(
new PaginationInfo(page, maxPage, pageSize, maxElement, query, queryFilters),
new PaginationInfo(page, maxPage, pageSize, maxElement, query, new FacetedSearchRequest(queryFilters)),
jpaRepository.search(query, page, pageSize, sortKey, sortOrder, queryFilters).stream()
.map(o -> new DbObject(o, schema))
.toList()

View File

@@ -0,0 +1,35 @@
package tech.ailef.dbadmin.external.dto;
import java.util.ArrayList;
import java.util.Set;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
public class FacetedSearchRequest implements FilterRequest {
private Set<QueryFilter> filters;
public FacetedSearchRequest(Set<QueryFilter> filters) {
this.filters = filters;
}
@Override
public MultiValueMap<String, String> computeParams() {
MultiValueMap<String, String> r = new LinkedMultiValueMap<>();
if (filters == null)
return r;
r.put("filter_field", new ArrayList<>());
r.put("filter_op", new ArrayList<>());
r.put("filter_value", new ArrayList<>());
for (QueryFilter filter : filters) {
r.get("filter_field").add(filter.getField().getJavaName());
r.get("filter_op").add(filter.getOp().toString());
r.get("filter_value").add(filter.getValue());
}
return r;
}
}

View File

@@ -0,0 +1,12 @@
package tech.ailef.dbadmin.external.dto;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
public interface FilterRequest {
public MultiValueMap<String, String> computeParams();
public static MultiValueMap<String, String> empty() {
return new LinkedMultiValueMap<>();
}
}

View File

@@ -2,13 +2,15 @@ package tech.ailef.dbadmin.external.dto;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
/**
* A client request for the Action logs page where
* several filtering parameters are present
*
*/
public class LogsSearchRequest {
public class LogsSearchRequest implements FilterRequest {
/**
* The table name to filter on
*/
@@ -124,5 +126,18 @@ public class LogsSearchRequest {
return PageRequest.of(actualPage, actualPageSize, Sort.by(sortKey).ascending());
}
}
@Override
public MultiValueMap<String, String> computeParams() {
LinkedMultiValueMap<String, String> params = new LinkedMultiValueMap<>();
if (table != null)
params.add("table", table);
if (itemId != null)
params.add("itemId", itemId);
if (actionType != null)
params.add("actionType", actionType);
return params;
}
}

View File

@@ -2,7 +2,6 @@ package tech.ailef.dbadmin.external.dto;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@@ -38,17 +37,17 @@ public class PaginationInfo {
// TODO: Check if used
private long maxElement;
private Set<QueryFilter> queryFilters;
private FilterRequest filterRequest;
private String query;
public PaginationInfo(int currentPage, int maxPage, int pageSize, long maxElement, String query, Set<QueryFilter> queryFilters) {
public PaginationInfo(int currentPage, int maxPage, int pageSize, long maxElement, String query, FilterRequest request) {
this.currentPage = currentPage;
this.maxPage = maxPage;
this.pageSize = pageSize;
this.query = query;
this.maxElement = maxElement;
this.queryFilters = queryFilters;
this.filterRequest = request;
}
public int getCurrentPage() {
@@ -80,7 +79,10 @@ public class PaginationInfo {
}
public String getSortedPageLink(String sortKey, String sortOrder) {
MultiValueMap<String, String> params = Utils.computeParams(queryFilters);
MultiValueMap<String, String> params = FilterRequest.empty();
if (filterRequest != null)
params = filterRequest.computeParams();
if (query != null) {
params.put("query", new ArrayList<>());
@@ -96,7 +98,10 @@ public class PaginationInfo {
}
public String getLink(int page) {
MultiValueMap<String, String> params = Utils.computeParams(queryFilters);
MultiValueMap<String, String> params = FilterRequest.empty();
if (filterRequest != null)
params = filterRequest.computeParams();
if (query != null) {
params.put("query", new ArrayList<>());

View File

@@ -1,12 +1,10 @@
package tech.ailef.dbadmin.external.misc;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import tech.ailef.dbadmin.external.dbmapping.DbObjectSchema;
@@ -61,23 +59,23 @@ public interface Utils {
* @param filters
* @return
*/
public static MultiValueMap<String, String> computeParams(Set<QueryFilter> filters) {
MultiValueMap<String, String> r = new LinkedMultiValueMap<>();
if (filters == null)
return r;
r.put("filter_field", new ArrayList<>());
r.put("filter_op", new ArrayList<>());
r.put("filter_value", new ArrayList<>());
for (QueryFilter filter : filters) {
r.get("filter_field").add(filter.getField().getJavaName());
r.get("filter_op").add(filter.getOp().toString());
r.get("filter_value").add(filter.getValue());
}
return r;
}
// public static MultiValueMap<String, String> computeParams(Set<QueryFilter> filters) {
// MultiValueMap<String, String> r = new LinkedMultiValueMap<>();
// if (filters == null)
// return r;
//
// r.put("filter_field", new ArrayList<>());
// r.put("filter_op", new ArrayList<>());
// r.put("filter_value", new ArrayList<>());
//
// for (QueryFilter filter : filters) {
// r.get("filter_field").add(filter.getField().getJavaName());
// r.get("filter_op").add(filter.getOp().toString());
// r.get("filter_value").add(filter.getValue());
// }
//
// return r;
// }
/**
* Converts a multi value map of parameters containing query filters applied