example api request filters

This commit is contained in:
Jake Potrebic 2021-03-25 00:27:35 -07:00
parent ad4b878e6f
commit f8107e0138
No known key found for this signature in database
GPG Key ID: 7C58557EC9C421F8
5 changed files with 62 additions and 4 deletions

View File

@ -0,0 +1,8 @@
package io.papermc.hangar.controller.extras.pagination;
import org.jdbi.v3.core.statement.SqlStatement;
public interface Filter {
void createSql(StringBuilder sb, SqlStatement<?> q);
}

View File

@ -0,0 +1,26 @@
package io.papermc.hangar.controller.extras.pagination;
import io.papermc.hangar.model.common.projects.Category;
import org.jdbi.v3.core.statement.SqlStatement;
import org.springframework.web.context.request.NativeWebRequest;
public class ProjectCategoryFilter implements Filter {
private static final String QUERY_PARAM = "projectCategory";
private final Category category;
public ProjectCategoryFilter(NativeWebRequest webRequest) {
this.category = Category.fromValue(webRequest.getParameterMap().get(QUERY_PARAM)[0]);
}
@Override
public void createSql(StringBuilder sb, SqlStatement<?> q) {
sb.append(" AND ").append("p.category").append(" = :").append("category");
q.bind("category", category);
}
public static boolean supports(NativeWebRequest webRequest) {
return webRequest.getParameterMap().containsKey(QUERY_PARAM);
}
}

View File

@ -0,0 +1,6 @@
package io.papermc.hangar.controller.extras.pagination;
public interface SortBy {
void createSql(StringBuilder sb);
}

View File

@ -1,5 +1,8 @@
package io.papermc.hangar.controller.extras.resolver;
import io.papermc.hangar.controller.extras.pagination.Filter;
import io.papermc.hangar.controller.extras.pagination.ProjectCategoryFilter;
import io.papermc.hangar.model.api.requests.RequestPagination;
import org.springframework.core.MethodParameter;
import org.springframework.lang.NonNull;
import org.springframework.web.bind.support.WebDataBinderFactory;
@ -14,13 +17,21 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import io.papermc.hangar.model.api.requests.RequestPagination;
import java.util.function.Predicate;
public class PaginationResolver implements HandlerMethodArgumentResolver {
private final HandlerMethodArgumentResolver delegate;
Map<Predicate<NativeWebRequest>, FilterConstructor> map = Map.of(
ProjectCategoryFilter::supports, ProjectCategoryFilter::new
);
@FunctionalInterface
interface FilterConstructor {
Filter create(NativeWebRequest webRequest);
}
public PaginationResolver(HandlerMethodArgumentResolver delegate) {
this.delegate = delegate;
}
@ -34,6 +45,13 @@ public class PaginationResolver implements HandlerMethodArgumentResolver {
public Object resolveArgument(@NonNull MethodParameter parameter, ModelAndViewContainer mavContainer, @NonNull NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
Object result = delegate.resolveArgument(parameter, mavContainer, webRequest, binderFactory);
map.forEach((nativeWebRequestPredicate, filterConstructor) -> {
if (nativeWebRequestPredicate.test(webRequest)) {
Filter filter = filterConstructor.create(webRequest);
// add filter to RequestPagination object
}
});
if (result instanceof RequestPagination) {
RequestPagination pagination = (RequestPagination) result;
Set<String> knownParams = new HashSet<>();

View File

@ -1,5 +1,6 @@
package io.papermc.hangar.db.extras;
import io.papermc.hangar.model.api.requests.RequestPagination;
import org.jdbi.v3.core.statement.SqlStatement;
import org.jdbi.v3.sqlobject.customizer.SqlStatementCustomizerFactory;
import org.jdbi.v3.sqlobject.customizer.SqlStatementCustomizingAnnotation;
@ -15,8 +16,6 @@ import java.lang.reflect.Parameter;
import java.lang.reflect.Type;
import java.util.regex.Pattern;
import io.papermc.hangar.model.api.requests.RequestPagination;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
@SqlStatementCustomizingAnnotation(BindPagination.BindPaginationFactory.class)
@ -37,6 +36,7 @@ public @interface BindPagination {
sort(pagination, sb);
offsetLimit(pagination, sb, q);
// use filters/sort here
// set the sql
q.define("pagination", sb.toString());
};