OpenApiConfiguration.java
package com.tdmconsult.ete.configuration;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import io.swagger.v3.oas.models.servers.Server;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.Locale;
import java.util.Optional;
import java.util.Properties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.info.BuildProperties;
import org.springframework.boot.info.GitProperties;
import org.springframework.context.annotation.Bean;
@Slf4j
public abstract class OpenApiConfiguration {
private static final DateTimeFormatter FORMATTER = DateTimeFormatter
.ofPattern("yyyy-MM-dd HH:mm:ss").withLocale(Locale.GERMAN)
.withZone(ZoneId.of("Europe/Berlin"));
@Value("${tdm.baseurl}")
private String baseUrl;
@Value("${server.servlet.contextPath}")
private String contextPath;
@Autowired
private Optional<GitProperties> gitProperties;
@Autowired
private Optional<BuildProperties> buildProperties;
@Bean
public OpenAPI customOpenApi() {
final Properties buildInfos = new Properties();
gitProperties.ifPresent(properties -> {
buildInfos.put("gitBranch", properties.getBranch());
buildInfos.put("gitHash", properties.getShortCommitId());
});
buildProperties.ifPresent(properties -> {
buildInfos.put("buildVersion", properties.getVersion());
buildInfos.put("buildTime", FORMATTER.format(properties.getTime()));
});
final String versionInfoString = String.format("%s - %s - %s - %s",
Optional.ofNullable(buildInfos.get("buildVersion")).orElse("N/A"),
Optional.ofNullable(buildInfos.get("gitBranch")).orElse("N/A"),
Optional.ofNullable(buildInfos.get("gitHash")).orElse("N/A"),
Optional.ofNullable(buildInfos.get("buildTime")).orElse("N/A"));
return new OpenAPI()
.addServersItem(new Server().url(baseUrl + contextPath))
.info(new Info()
.version(getVersion())
.contact(getContact())
.title(getTitle())
.description(getTitle() + " // Build " + versionInfoString))
.components(
new Components()
.addSecuritySchemes("basicAuth", getBasicAuthScheme())
.addSecuritySchemes("bearerToken", getBearerTokenAuthScheme())
)
.security(Collections.singletonList(
new SecurityRequirement()
.addList("basicAuth")
.addList("bearerToken")
));
}
private SecurityScheme getBasicAuthScheme() {
final SecurityScheme scheme = new SecurityScheme();
scheme.setScheme("basic");
scheme.setType(SecurityScheme.Type.HTTP);
return scheme;
}
private SecurityScheme getBearerTokenAuthScheme() {
final SecurityScheme scheme = new SecurityScheme();
scheme.setScheme("bearer");
scheme.setType(SecurityScheme.Type.HTTP);
return scheme;
}
private Contact getContact() {
final Contact contact = new Contact();
contact.setName("TDM Consult GmbH");
contact.setEmail("info@tdm-consult.com");
return contact;
}
public abstract String getVersion();
public abstract String getTitle();
}