Skip to content

Commit

Permalink
Added new Filter to automatically set the server in the OpenAPI Schema
Browse files Browse the repository at this point in the history
Signed-off-by: Phillip Kruger <[email protected]>
  • Loading branch information
phillip-kruger committed May 30, 2022
1 parent 817dae1 commit b4854bc
Show file tree
Hide file tree
Showing 3 changed files with 123 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,13 @@ public final class SmallRyeOpenApiConfig {
@ConfigItem(defaultValue = "true")
public boolean autoAddTags;

/**
* This will automatically add a default server to the schema if non is provided, using the current running server host and
* port
*/
@ConfigItem(defaultValue = "false")
public boolean autoAddServer;

/**
* This will automatically add security based on the security extension included (if any).
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.io.InputStreamReader;
import java.io.UncheckedIOException;
import java.lang.reflect.Modifier;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
Expand Down Expand Up @@ -81,6 +82,7 @@
import io.quarkus.security.Authenticated;
import io.quarkus.smallrye.openapi.common.deployment.SmallRyeOpenApiConfig;
import io.quarkus.smallrye.openapi.deployment.filter.AutoRolesAllowedFilter;
import io.quarkus.smallrye.openapi.deployment.filter.AutoServerFilter;
import io.quarkus.smallrye.openapi.deployment.filter.AutoTagFilter;
import io.quarkus.smallrye.openapi.deployment.filter.SecurityConfigFilter;
import io.quarkus.smallrye.openapi.deployment.spi.AddToOpenAPIDefinitionBuildItem;
Expand Down Expand Up @@ -292,7 +294,7 @@ OpenApiFilteredIndexViewBuildItem smallryeOpenApiIndex(CombinedIndexBuildItem co
@BuildStep
void addSecurityFilter(BuildProducer<AddToOpenAPIDefinitionBuildItem> addToOpenAPIDefinitionProducer,
OpenApiFilteredIndexViewBuildItem apiFilteredIndexViewBuildItem,
SmallRyeOpenApiConfig config) {
SmallRyeOpenApiConfig config) throws MalformedURLException {

List<AnnotationInstance> rolesAllowedAnnotations = new ArrayList<>();
for (DotName rolesAllowed : SecurityConstants.ROLES_ALLOWED) {
Expand Down Expand Up @@ -343,6 +345,11 @@ void addSecurityFilter(BuildProducer<AddToOpenAPIDefinitionBuildItem> addToOpenA
addToOpenAPIDefinitionProducer.produce(new AddToOpenAPIDefinitionBuildItem(autoTagFilter));
}

// Add Auto Server based on the current server details
OASFilter autoServerFilter = getAutoServerFilter(config);
if (autoServerFilter != null) {
addToOpenAPIDefinitionProducer.produce(new AddToOpenAPIDefinitionBuildItem(autoServerFilter));
}
}

private OASFilter getAutoSecurityFilter(List<SecurityInformationBuildItem> securityInformationBuildItems,
Expand Down Expand Up @@ -440,6 +447,27 @@ private OASFilter getAutoTagFilter(OpenApiFilteredIndexViewBuildItem apiFiltered
return null;
}

private OASFilter getAutoServerFilter(SmallRyeOpenApiConfig config) throws MalformedURLException {
if (config.autoAddServer) {
Config c = ConfigProvider.getConfig();

String scheme = "http";
String host = c.getOptionalValue("quarkus.http.host", String.class).orElse("0.0.0.0");
int port;

String insecure = c.getOptionalValue("quarkus.http.insecure-requests", String.class).orElse("enabled");
if (insecure.equalsIgnoreCase("enabled")) {
port = c.getOptionalValue("quarkus.http.port", Integer.class).orElse(8080);
} else {
scheme = "https";
port = c.getOptionalValue("quarkus.http.ssl-port", Integer.class).orElse(8443);
}

return new AutoServerFilter(scheme, host, port);
}
return null;
}

private Map<String, List<String>> getRolesAllowedMethodReferences(
OpenApiFilteredIndexViewBuildItem apiFilteredIndexViewBuildItem) {
List<AnnotationInstance> rolesAllowedAnnotations = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package io.quarkus.smallrye.openapi.deployment.filter;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.microprofile.openapi.OASFilter;
import org.eclipse.microprofile.openapi.models.OpenAPI;
import org.eclipse.microprofile.openapi.models.servers.Server;

import io.smallrye.openapi.api.models.servers.ServerImpl;

/**
* Automatically add default server if none is provided
*/
public class AutoServerFilter implements OASFilter {

private static final String DESCRIPTION = "Auto generated value";
private static final String ZEROS = "0.0.0.0";
private static final String LOCALHOST = "localhost";
private static final String URL_PATTERN = "%s://%s:%d";

private String defaultScheme;
private String defaultHost;
private int defaultPort;

public AutoServerFilter() {

}

public AutoServerFilter(String defaultScheme, String defaultHost, int defaultPort) {
this.defaultScheme = defaultScheme;
this.defaultHost = defaultHost;
this.defaultPort = defaultPort;
}

public String getDefaultScheme() {
return defaultScheme;
}

public void setDefaultScheme(String defaultScheme) {
this.defaultScheme = defaultScheme;
}

public String getDefaultHost() {
return defaultHost;
}

public void setDefaultHost(String defaultHost) {
this.defaultHost = defaultHost;
}

public int getDefaultPort() {
return defaultPort;
}

public void setDefaultPort(int defaultPort) {
this.defaultPort = defaultPort;
}

@Override
public void filterOpenAPI(OpenAPI openAPI) {

List<Server> servers = openAPI.getServers();
if (servers == null || servers.isEmpty()) {
servers = new ArrayList<>();

// In case of 0.0.0.0, also add localhost
if (this.defaultHost.equals(ZEROS)) {
ServerImpl localhost = new ServerImpl();
localhost.setUrl(getUrl(this.defaultScheme, LOCALHOST, this.defaultPort));
localhost.setDescription(DESCRIPTION);
servers.add(localhost);
}

ServerImpl serverImpl = new ServerImpl();
serverImpl.setUrl(getUrl(this.defaultScheme, this.defaultHost, this.defaultPort));
serverImpl.setDescription(DESCRIPTION);
servers.add(serverImpl);

openAPI.setServers(servers);
}
}

private String getUrl(String scheme, String host, int port) {
return String.format(URL_PATTERN, scheme, host, port);
}
}

0 comments on commit b4854bc

Please sign in to comment.