All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.javalin.openapi.plugin.OpenApiConfiguration.kt Maven / Gradle / Ivy

The newest version!
package io.javalin.openapi.plugin

import com.fasterxml.jackson.databind.node.ObjectNode
import io.javalin.openapi.ApiKeyAuth
import io.javalin.openapi.BasicAuth
import io.javalin.openapi.BearerAuth
import io.javalin.openapi.CookieAuth
import io.javalin.openapi.OAuth2
import io.javalin.openapi.OpenApiInfo
import io.javalin.openapi.OpenApiServer
import io.javalin.openapi.OpenID
import io.javalin.openapi.Security
import io.javalin.openapi.SecurityScheme
import io.javalin.security.RouteRole
import java.util.function.BiConsumer
import java.util.function.Consumer

/** Configure OpenApi plugin */
class OpenApiPluginConfiguration @JvmOverloads constructor(
    @JvmField var documentationPath: String = "/openapi",
    @JvmField var roles: List? = null,
    @JvmField var definitionConfiguration: BiConsumer? = null
) {

    /** Path to host documentation as JSON */
    fun withDocumentationPath(path: String): OpenApiPluginConfiguration = also {
        this.documentationPath = path
    }

    /** List of roles eligible to access OpenApi routes */
    fun withRoles(vararg roles: RouteRole): OpenApiPluginConfiguration = also {
        this.roles = roles.toList()
    }

    /* */
    fun withDefinitionConfiguration(definitionConfigurationConfigurer: BiConsumer): OpenApiPluginConfiguration = also {
        definitionConfiguration = definitionConfigurationConfigurer
    }

}

/** Modify OpenApi documentation represented by [ObjectNode] in JSON format */
fun interface DefinitionProcessor {
    fun process(content: ObjectNode): String
}

class DefinitionConfiguration @JvmOverloads constructor(
    @JvmField @JvmSynthetic internal var info: OpenApiInfo? = null,
    @JvmField @JvmSynthetic internal var servers: MutableList = mutableListOf(),
    @JvmField @JvmSynthetic internal var security: SecurityComponentConfiguration? = null,
    @JvmField @JvmSynthetic internal var definitionProcessor: DefinitionProcessor? = null
) {

    /** Define custom info object */
    fun withInfo(openApiInfo: Consumer): DefinitionConfiguration = also {
        this.info = OpenApiInfo().also { openApiInfo.accept(it) }
    }

    @Deprecated("Use withInfo instead", ReplaceWith("withInfo(openApiInfo)"))
    fun withOpenApiInfo(openApiInfo: Consumer): DefinitionConfiguration =
        withInfo(openApiInfo)

    /** Add custom server **/
    fun withServer(server: OpenApiServer): DefinitionConfiguration = also {
        this.servers.add(server)
    }

    /** Add custom server **/
    fun withServer(serverConfigurer: Consumer): DefinitionConfiguration = also {
        this.servers.add(OpenApiServer().also { serverConfigurer.accept(it) })
    }

    /** Define custom security object */
    fun withSecurity(securityConfigurer: Consumer): DefinitionConfiguration = also {
        SecurityComponentConfiguration()
            .also { securityConfigurer.accept(it) }
            .let { withSecurity(it) }
    }

    /** Define custom security object */
    fun withSecurity(securityConfiguration: SecurityComponentConfiguration): DefinitionConfiguration = also {
        this.security = securityConfiguration
    }

    /** Register scheme processor */
    fun withDefinitionProcessor(definitionProcessor: DefinitionProcessor): DefinitionConfiguration = also {
        this.definitionProcessor = definitionProcessor
    }

}

class SecurityComponentConfiguration @JvmOverloads constructor(
    @JvmField @JvmSynthetic internal val securitySchemes: MutableMap = mutableMapOf(),
    @JvmField @JvmSynthetic internal val globalSecurity: MutableList = mutableListOf()
) {

    fun withSecurityScheme(schemeName: String, securityScheme: SecurityScheme): SecurityComponentConfiguration = also {
        securitySchemes[schemeName] = securityScheme
    }

    @JvmOverloads
    fun withBasicAuth(schemeName: String = "BasicAuth", securityScheme: Consumer = Consumer {}): SecurityComponentConfiguration =
        withSecurityScheme(schemeName, BasicAuth().also { securityScheme.accept(it) })

    @JvmOverloads
    fun withBearerAuth(schemeName: String = "BearerAuth", securityScheme: Consumer = Consumer {}): SecurityComponentConfiguration =
        withSecurityScheme(schemeName, BearerAuth().also { securityScheme.accept(it) })

    @JvmOverloads
    fun withApiKeyAuth(schemeName: String = "ApiKeyAuth", apiKeyHeader: String = "X-Api-Key", securityScheme: Consumer = Consumer {}): SecurityComponentConfiguration =
        withSecurityScheme(schemeName, ApiKeyAuth(apiKeyHeader).also { securityScheme.accept(it) })

    @JvmOverloads
    fun withCookieAuth(schemeName: String = "CookieAuth", sessionCookie: String = "JSESSIONID", securityScheme: Consumer = Consumer {}): SecurityComponentConfiguration =
        withSecurityScheme(schemeName, CookieAuth(sessionCookie).also { securityScheme.accept(it) })

    @JvmOverloads
    fun withOpenID(schemeName: String, openIdConnectUrl: String, securityScheme: Consumer = Consumer {}): SecurityComponentConfiguration =
        withSecurityScheme(schemeName, OpenID(openIdConnectUrl).also { securityScheme.accept(it) })

    @JvmOverloads
    fun withOAuth2(schemeName: String, description: String, securityScheme: Consumer = Consumer {}): SecurityComponentConfiguration =
        withSecurityScheme(schemeName, OAuth2(description).also { securityScheme.accept(it) })

    fun withGlobalSecurity(security: Security): SecurityComponentConfiguration = also {
        globalSecurity.add(security)
    }

    @JvmOverloads
    fun withGlobalSecurity(name: String, security: Consumer = Consumer {}): SecurityComponentConfiguration =
        withGlobalSecurity(Security(name).also { security.accept(it) })

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy