Skip to content

Commit

Permalink
Merge pull request #91 from mcxinyu/develop-diy
Browse files Browse the repository at this point in the history
Provide a hook function that allows developers to modify the final generated openapi.json
  • Loading branch information
SMILEY4 authored Mar 25, 2024
2 parents e42fe3e + 61b6b72 commit 3aa85a1
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ private fun buildOpenApiSpec(pluginConfig: PluginConfigData, routes: List<RouteM
val schemaContext = schemaContext(pluginConfig, routes)
val exampleContext = exampleContext(pluginConfig, routes)
val openApi = builder(pluginConfig, schemaContext, exampleContext).build(routes)
pluginConfig.whenBuildOpenApiSpecs?.invoke(openApi)
Json.pretty(openApi)
} catch (e: Exception) {
logger.error("Error during openapi-generation", e)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package io.github.smiley4.ktorswaggerui.data

import io.github.smiley4.ktorswaggerui.dsl.PluginConfigDsl
import io.github.smiley4.ktorswaggerui.dsl.OpenApiResponse
import io.github.smiley4.ktorswaggerui.dsl.PluginConfigDsl
import kotlin.reflect.KClass

data class PluginConfigData(
Expand All @@ -20,7 +20,8 @@ data class PluginConfigData(
val customSchemas: Map<String, BaseCustomSchema>,
val includeAllCustomSchemas: Boolean,
val encoding: EncodingData,
val specConfigs: MutableMap<String,PluginConfigData>
val specConfigs: MutableMap<String, PluginConfigData>,
val whenBuildOpenApiSpecs: WhenBuildOpenApiSpecs?
) {

companion object {
Expand All @@ -40,7 +41,8 @@ data class PluginConfigData(
customSchemas = emptyMap(),
includeAllCustomSchemas = false,
encoding = EncodingData.DEFAULT,
specConfigs = mutableMapOf()
specConfigs = mutableMapOf(),
whenBuildOpenApiSpecs = null
)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package io.github.smiley4.ktorswaggerui.data

import io.swagger.v3.oas.models.OpenAPI

/**
* @author <a href=mailto:mcxinyu@foxmail.com>yuefeng</a> in 2024/3/25.
*/
typealias WhenBuildOpenApiSpecs = (openApi: OpenAPI) -> Unit
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
package io.github.smiley4.ktorswaggerui.dsl

import io.github.smiley4.ktorswaggerui.data.*
import io.github.smiley4.ktorswaggerui.data.DataUtils.merge
import io.github.smiley4.ktorswaggerui.data.DataUtils.mergeBoolean
import io.github.smiley4.ktorswaggerui.data.PathFilter
import io.github.smiley4.ktorswaggerui.data.PluginConfigData
import io.github.smiley4.ktorswaggerui.data.SecuritySchemeData
import io.github.smiley4.ktorswaggerui.data.ServerData
import io.github.smiley4.ktorswaggerui.data.SpecAssigner
import io.github.smiley4.ktorswaggerui.data.TagData
import io.github.smiley4.ktorswaggerui.data.TagGenerator
import io.ktor.http.HttpStatusCode
import io.ktor.server.routing.RouteSelector
import io.ktor.http.*
import io.ktor.server.routing.*
import kotlin.collections.Collection
import kotlin.collections.Set
import kotlin.collections.buildList
import kotlin.collections.buildMap
import kotlin.collections.buildSet
import kotlin.collections.component1
import kotlin.collections.component2
import kotlin.collections.forEach
import kotlin.collections.map
import kotlin.collections.mutableListOf
import kotlin.collections.mutableMapOf
import kotlin.collections.set
import kotlin.reflect.KClass

/**
Expand Down Expand Up @@ -163,6 +169,7 @@ class PluginConfigDsl {
*/
var ignoredRouteSelectors: Set<KClass<*>> = PluginConfigData.DEFAULT.ignoredRouteSelectors

var whenBuildOpenApiSpecs: WhenBuildOpenApiSpecs? = null

internal fun build(base: PluginConfigData): PluginConfigData {
return PluginConfigData(
Expand Down Expand Up @@ -200,12 +207,12 @@ class PluginConfigDsl {
},
includeAllCustomSchemas = mergeBoolean(base.includeAllCustomSchemas, customSchemas.includeAll),
encoding = encodingConfig.build(base.encoding),
specConfigs = mutableMapOf()
specConfigs = mutableMapOf(),
whenBuildOpenApiSpecs = whenBuildOpenApiSpecs,
).also {
specConfigs.forEach { (specId, config) ->
it.specConfigs[specId] = config.build(it)
}
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import io.ktor.server.engine.embeddedServer
import io.ktor.server.netty.Netty
import io.ktor.server.response.respondText
import io.ktor.server.routing.routing
import io.swagger.v3.oas.models.servers.Server

fun main() {
embeddedServer(Netty, port = 8080, host = "localhost", module = Application::myModule).start(wait = true)
Expand Down Expand Up @@ -60,6 +61,21 @@ private fun Application.myModule() {
type = AuthType.HTTP
scheme = AuthScheme.BASIC
}
whenBuildOpenApiSpecs = {
it.paths.forEach { t, u ->
println("$t $u")
if (t == "/hello") {
u.servers ?: run {
u.servers = mutableListOf()
}
u.servers.add(
Server().apply {
url = "http://local.api"
}
)
}
}
}
}

// configure routes
Expand Down

0 comments on commit 3aa85a1

Please sign in to comment.