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();
}