diff --git a/src/main/java/run/halo/app/config/WebFluxConfig.java b/src/main/java/run/halo/app/config/WebFluxConfig.java index 3bc9f5c41..ae55dfc1e 100644 --- a/src/main/java/run/halo/app/config/WebFluxConfig.java +++ b/src/main/java/run/halo/app/config/WebFluxConfig.java @@ -65,8 +65,7 @@ public class WebFluxConfig implements WebFluxConfigurer { @Bean RouterFunction customEndpoints(ApplicationContext context) { var builder = new CustomEndpointsBuilder(); - context.getBeansOfType(CustomEndpoint.class).values() - .forEach(customEndpoint -> builder.add(customEndpoint.endpoint())); + context.getBeansOfType(CustomEndpoint.class).values().forEach(builder::add); return builder.build(); } diff --git a/src/main/java/run/halo/app/core/extension/endpoint/CustomEndpoint.java b/src/main/java/run/halo/app/core/extension/endpoint/CustomEndpoint.java index 906d77636..86acd1911 100644 --- a/src/main/java/run/halo/app/core/extension/endpoint/CustomEndpoint.java +++ b/src/main/java/run/halo/app/core/extension/endpoint/CustomEndpoint.java @@ -2,15 +2,19 @@ package run.halo.app.core.extension.endpoint; import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.ServerResponse; +import run.halo.app.extension.GroupVersion; /** * RouterFunction provider for custom endpoints. * * @author johnniang */ -@FunctionalInterface public interface CustomEndpoint { RouterFunction endpoint(); + default GroupVersion groupVersion() { + return GroupVersion.parseAPIVersion("api.console.halo.run/v1alpha1"); + } + } diff --git a/src/main/java/run/halo/app/core/extension/endpoint/CustomEndpointsBuilder.java b/src/main/java/run/halo/app/core/extension/endpoint/CustomEndpointsBuilder.java index c9d3bcff1..fa1d90b26 100644 --- a/src/main/java/run/halo/app/core/extension/endpoint/CustomEndpointsBuilder.java +++ b/src/main/java/run/halo/app/core/extension/endpoint/CustomEndpointsBuilder.java @@ -1,33 +1,41 @@ package run.halo.app.core.extension.endpoint; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; +import java.util.Map; import org.springdoc.webflux.core.fn.SpringdocRouteBuilder; import org.springframework.web.reactive.function.server.RequestPredicates; import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.ServerResponse; +import run.halo.app.extension.GroupVersion; public class CustomEndpointsBuilder { - private final List> routerFunctions; + private final Map>> routerFunctionsMap; public CustomEndpointsBuilder() { - routerFunctions = new LinkedList<>(); + routerFunctionsMap = new HashMap<>(); } - public CustomEndpointsBuilder add(RouterFunction routerFunction) { - routerFunctions.add(routerFunction); + public CustomEndpointsBuilder add(CustomEndpoint customEndpoint) { + routerFunctionsMap + .computeIfAbsent(customEndpoint.groupVersion(), gv -> new LinkedList<>()) + .add(customEndpoint.endpoint()); return this; } public RouterFunction build() { - return SpringdocRouteBuilder.route() - .nest(RequestPredicates.path("/apis/api.console.halo.run/v1alpha1"), + SpringdocRouteBuilder routeBuilder = SpringdocRouteBuilder.route(); + routerFunctionsMap.forEach((gv, routerFunctions) -> { + routeBuilder.nest(RequestPredicates.path("/apis/" + gv), () -> routerFunctions.stream().reduce(RouterFunction::and).orElse(null), - builder -> builder - .operationId("CustomEndpoints") - .description("Custom endpoints") - .tag("api.console.halo.run/v1alpha1/CustomEndpoint")) - .build(); + builder -> builder.operationId("CustomEndpoints") + .description("Custom Endpoint") + .tag(gv + "/CustomEndpoint") + ); + }); + routerFunctionsMap.clear(); + return routeBuilder.build(); } }