From 1714f8edb2a34ee21bb6349ca0da6486d522b4d8 Mon Sep 17 00:00:00 2001 From: John Niang Date: Tue, 20 Sep 2022 14:38:09 +0800 Subject: [PATCH] Refactor CustomEndpoint for customizing GroupVersion (#2429) #### What type of PR is this? /kind improvement /area core /milestone 2.0.0 #### What this PR does / why we need it: Refactor CustomEndpoint for customizing GroupVersion. #### Does this PR introduce a user-facing change? ```release-note None ``` --- .../run/halo/app/config/WebFluxConfig.java | 3 +- .../extension/endpoint/CustomEndpoint.java | 6 +++- .../endpoint/CustomEndpointsBuilder.java | 30 ++++++++++++------- 3 files changed, 25 insertions(+), 14 deletions(-) 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(); } }