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 242c765
Show file tree
Hide file tree
Showing 3 changed files with 127 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;

/**
* Setting it to `true` will automatically add a default server to the schema if none is provided,
* using the current running server host and port.
*/
@ConfigItem
public Optional<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 @@ -81,6 +81,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 @@ -290,7 +291,7 @@ OpenApiFilteredIndexViewBuildItem smallryeOpenApiIndex(CombinedIndexBuildItem co
}

@BuildStep
void addSecurityFilter(BuildProducer<AddToOpenAPIDefinitionBuildItem> addToOpenAPIDefinitionProducer,
void addAutoFilters(BuildProducer<AddToOpenAPIDefinitionBuildItem> addToOpenAPIDefinitionProducer,
OpenApiFilteredIndexViewBuildItem apiFilteredIndexViewBuildItem,
SmallRyeOpenApiConfig config) {

Expand Down Expand Up @@ -343,6 +344,11 @@ void addSecurityFilter(BuildProducer<AddToOpenAPIDefinitionBuildItem> addToOpenA
addToOpenAPIDefinitionProducer.produce(new AddToOpenAPIDefinitionBuildItem(autoTagFilter));
}

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

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

private OASFilter getAutoServerFilter(SmallRyeOpenApiConfig config, boolean defaultFlag) {
if (config.autoAddServer.orElse(defaultFlag)) {
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 Expand Up @@ -976,6 +1003,11 @@ private OpenApiDocument storeDocument(OutputTargetBuildItem out,
OpenApiDocument document = prepareOpenApiDocument(staticModel, annotationModel, openAPIBuildItems);

document.filter(filter(openApiConfig)); // This usually happens at runtime, so when storing we want to filter here too.
// By default also add the auto generated server
OASFilter autoServerFilter = getAutoServerFilter(smallRyeOpenApiConfig, true);
if (autoServerFilter != null) {
document.filter(autoServerFilter);
}
document.initialize();

// Store the document if needed
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 242c765

Please sign in to comment.