mirror of
https://github.com/dalbodeule/snap-admin.git
synced 2025-06-08 21:38:21 +00:00
Better error handling of invalid values in faceted search
This commit is contained in:
parent
fd2728083b
commit
e72fcda5fe
@ -37,6 +37,7 @@ 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;
|
||||
import tech.ailef.dbadmin.external.exceptions.DbAdminException;
|
||||
import tech.ailef.dbadmin.external.exceptions.InvalidPageException;
|
||||
import tech.ailef.dbadmin.external.misc.Utils;
|
||||
import tech.ailef.dbadmin.internal.model.UserAction;
|
||||
@ -184,6 +185,16 @@ public class DefaultDbAdminController {
|
||||
|
||||
} catch (InvalidPageException e) {
|
||||
return "redirect:/" + properties.getBaseUrl() + "/model/" + className;
|
||||
} catch (DbAdminException e) {
|
||||
model.addAttribute("error", e.getMessage());
|
||||
model.addAttribute("errorTitle", "Invalid request");
|
||||
model.addAttribute("schema", schema);
|
||||
model.addAttribute("activePage", "entities");
|
||||
model.addAttribute("sortKey", sortKey);
|
||||
model.addAttribute("query", query);
|
||||
model.addAttribute("sortOrder", sortOrder);
|
||||
model.addAttribute("activeFilters", queryFilters);
|
||||
return "model/list";
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -153,7 +153,12 @@ public class CustomJpaRepository extends SimpleJpaRepository {
|
||||
String fieldName = dbField.getJavaName();
|
||||
String v = filter.getValue();
|
||||
|
||||
Object value = dbField.getType().parseValue(v);
|
||||
Object value;
|
||||
try {
|
||||
value = dbField.getType().parseValue(v);
|
||||
} catch (Exception e) {
|
||||
throw new DbAdminException("Invalid value `" + v + "` specified for field `" + dbField.getName() + "`");
|
||||
}
|
||||
|
||||
if (op == CompareOperator.STRING_EQ) {
|
||||
if (value == null)
|
||||
|
@ -3,6 +3,7 @@ package tech.ailef.dbadmin.external.dto;
|
||||
import java.util.Objects;
|
||||
|
||||
import tech.ailef.dbadmin.external.dbmapping.DbField;
|
||||
import tech.ailef.dbadmin.external.exceptions.DbAdminException;
|
||||
|
||||
/**
|
||||
* A single filter in a FacetedSearchRequest. This describes a
|
||||
@ -16,6 +17,8 @@ public class QueryFilter {
|
||||
private String value;
|
||||
|
||||
public QueryFilter(DbField field, CompareOperator op, String value) {
|
||||
if (field == null)
|
||||
throw new DbAdminException("Trying to build QueryFilter with null `field`");
|
||||
this.field = field;
|
||||
this.op = op;
|
||||
this.value = value;
|
||||
@ -53,7 +56,7 @@ public class QueryFilter {
|
||||
public String toString() {
|
||||
if (value != null && !value.toString().isBlank()) {
|
||||
String displayValue = value;
|
||||
if (value.length() > 10) {
|
||||
if (value.length() > 18) {
|
||||
displayValue = value.substring(0, 4) + "..." + value.substring(value.length() - 4);
|
||||
}
|
||||
return "'" + field.getName() + "' " + op.getDisplayName() + " '" + displayValue + "'";
|
||||
|
@ -7,6 +7,7 @@ import java.util.Set;
|
||||
|
||||
import org.springframework.util.MultiValueMap;
|
||||
|
||||
import tech.ailef.dbadmin.external.dbmapping.DbField;
|
||||
import tech.ailef.dbadmin.external.dbmapping.DbObjectSchema;
|
||||
import tech.ailef.dbadmin.external.dto.CompareOperator;
|
||||
import tech.ailef.dbadmin.external.dto.QueryFilter;
|
||||
@ -81,9 +82,16 @@ public interface Utils {
|
||||
String op = ops.get(i);
|
||||
String field = fields.get(i);
|
||||
String value = values.get(i);
|
||||
|
||||
QueryFilter queryFilter = new QueryFilter(schema.getFieldByJavaName(field), CompareOperator.valueOf(op.toUpperCase()), value);
|
||||
filters.add(queryFilter);
|
||||
|
||||
// Check if the field can actually be found before creating the filter
|
||||
// This shouldn't normally happen because this parameter is not provided
|
||||
// by the user; but there's the chance of a stale bookmarked link referring
|
||||
// to a non-existing schema or the user fiddling with the URL
|
||||
DbField dbField = schema.getFieldByJavaName(field);
|
||||
if (dbField != null) {
|
||||
QueryFilter queryFilter = new QueryFilter(dbField, CompareOperator.valueOf(op.toUpperCase()), value);
|
||||
filters.add(queryFilter);
|
||||
}
|
||||
}
|
||||
|
||||
return filters;
|
||||
|
@ -59,7 +59,7 @@
|
||||
<div class="input-group pe-2">
|
||||
<!-- Reset page when applying filter to start back at page 1 -->
|
||||
<input type="hidden" name="page" value="1">
|
||||
<input type="hidden" name="pageSize" th:value="${page.getPagination().getPageSize()}">
|
||||
<input type="hidden" name="pageSize" th:value="${page != null ? page.getPagination().getPageSize() : '50'}">
|
||||
<input type="hidden" name="query" th:value="${query}">
|
||||
<input type="hidden" name="filter_field" th:value="${field.getJavaName()}">
|
||||
|
||||
@ -139,7 +139,7 @@
|
||||
|
||||
<!-- Reset page when applying filter to start back at page 1 -->
|
||||
<input type="hidden" name="page" value="1">
|
||||
<input type="hidden" name="pageSize" th:value="${page.getPagination().getPageSize()}">
|
||||
<input type="hidden" name="pageSize" th:value="${page != null ? page.getPagination().getPageSize() : '50'}">
|
||||
<input type="hidden" name="query" th:value="${query}">
|
||||
<input type="hidden" name="filter_field" th:value="${field.getJavaName()}">
|
||||
|
||||
|
@ -47,7 +47,7 @@
|
||||
|
||||
<input type="hidden" name="page" value="1">
|
||||
<input type="hidden" name="pageSize"
|
||||
th:value="${page.getPagination().getPageSize()}">
|
||||
th:value="${page != null ? page.getPagination().getPageSize() : '50'}">
|
||||
</form>
|
||||
<div class="separator mb-4 mt-4"></div>
|
||||
|
||||
@ -67,8 +67,10 @@
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div th:replace="~{fragments/table_selectable :: table(results=${page.getResults()}, schema=${schema})}">
|
||||
</div>
|
||||
<th:block th:if="${page}">
|
||||
<div th:replace="~{fragments/table_selectable :: table(results=${page.getResults()}, schema=${schema})}">
|
||||
</div>
|
||||
</th:block>
|
||||
</div>
|
||||
</div>
|
||||
<div th:if="${!schema.getFilterableFields().isEmpty()}" class="col-3">
|
||||
|
Loading…
x
Reference in New Issue
Block a user