mirror of
https://github.com/HangarMC/Hangar.git
synced 2025-01-30 14:30:08 +08:00
example api request filters
This commit is contained in:
parent
ad4b878e6f
commit
f8107e0138
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
package io.papermc.hangar.controller.extras.pagination;
|
||||
|
||||
public interface SortBy {
|
||||
|
||||
void createSql(StringBuilder sb);
|
||||
}
|
@ -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<>();
|
||||
|
@ -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());
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user