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

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

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

import io.javalin.Javalin
import io.javalin.core.plugin.Plugin
import io.javalin.core.plugin.PluginLifecycleInit
import io.javalin.core.util.JavalinLogger
import io.javalin.core.util.OptionalDependency
import io.javalin.core.util.Util
import io.javalin.plugin.openapi.ui.ReDocRenderer
import io.javalin.plugin.openapi.ui.SwaggerRenderer
import io.javalin.plugin.openapi.utils.OpenApiVersionUtil

/**
 * Plugin for the the automatic generation of an open api schema.
 * The schema can be extracted with [JavalinOpenApi.createSchema].
 */
class OpenApiPlugin(private vararg val options: OpenApiOptions) : Plugin, PluginLifecycleInit {

    init {
        if (OpenApiVersionUtil.logWarnings && OpenApiVersionUtil.warning != null) {
            JavalinLogger.warn("${OpenApiVersionUtil.warning} - the OpenAPI plugin will not work properly. " +
                    "Please visit https://github.com/tipsy/javalin/issues/1193 if you want to help fix this issue.")
            JavalinLogger.warn("You can disable this warning by doing `OpenApiVersionUtil.logWarnings = false`")
        }
    }

    lateinit var openApiHandler: OpenApiHandler

    private val handlerMap = mutableMapOf()

    override fun init(app: Javalin) {
        if (options.isEmpty()) {
            throw IllegalArgumentException("The OpenApiPlugin requires at least one set of Options")
        }
        openApiHandler = OpenApiHandler(app, options.first())
        options.forEach {
            it.path?.let { path ->
                handlerMap.putIfAbsent(path, OpenApiHandler(app, it))
            }
        }
    }

    override fun apply(app: Javalin) {
        Util.ensureDependencyPresent(OptionalDependency.SWAGGER_CORE)
        options.forEach { options ->
            if (options.path == null && (options.swagger != null || options.reDoc != null)) {
                throw IllegalStateException("""
                Swagger or ReDoc is enabled, but there is no endpoint available for the OpenApi schema.
                Please use the `path` option of the OpenApiPlugin to set a schema endpoint.
            """.trimIndent().replace("\n", " "))
            }

            options.path?.let { path ->
                app.get(path, handlerMap[path]!!, *options.roles.toTypedArray())

                options.swagger?.let {
                    Util.assertWebjarInstalled(OptionalDependency.SWAGGERUI)
                    app.get(it.path, SwaggerRenderer(options), *options.roles.toTypedArray())
                }

                options.reDoc?.let {
                    Util.assertWebjarInstalled(OptionalDependency.REDOC)
                    app.get(it.path, ReDocRenderer(options), *options.roles.toTypedArray())
                }

                if (options.swagger != null || options.reDoc != null) {
                    app._conf.enableWebjars()
                }
            }

        }

    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy