Skip to content

Commit 9953980

Browse files
committed
Merge branch 'develop' into release
2 parents adb5ffc + 36ccb04 commit 9953980

File tree

94 files changed

+4433
-4118
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

94 files changed

+4433
-4118
lines changed

build.gradle.kts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,20 @@ plugins {
44
kotlin("jvm") version "1.7.21"
55
`maven-publish`
66
id("org.owasp.dependencycheck") version "8.2.1"
7+
kotlin("plugin.serialization") version "1.8.21"
78
}
89

910
group = "io.github.smiley4"
10-
version = "1.6.1"
11+
version = "2.0.0-rc"
1112

1213
repositories {
1314
mavenCentral()
15+
maven(url = "https://raw.githubusercontent.com/glureau/json-schema-serialization/mvn-repo")
1416
}
1517

1618
dependencies {
1719

18-
val ktorVersion = "2.2.4"
20+
val ktorVersion = "2.3.0"
1921
implementation("io.ktor:ktor-server-core-jvm:$ktorVersion")
2022
implementation("io.ktor:ktor-server-webjars:$ktorVersion")
2123
implementation("io.ktor:ktor-server-auth:$ktorVersion")
@@ -37,6 +39,9 @@ dependencies {
3739
implementation("com.github.victools:jsonschema-module-jackson:$jsonSchemaGeneratorVersion")
3840
implementation("com.github.victools:jsonschema-module-swagger-2:$jsonSchemaGeneratorVersion")
3941

42+
val jacksonVersion = "2.14.2"
43+
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:${jacksonVersion}")
44+
4045
val kotlinLoggingVersion = "2.1.23"
4146
implementation("io.github.microutils:kotlin-logging-jvm:$kotlinLoggingVersion")
4247

@@ -53,6 +58,9 @@ dependencies {
5358
val versionKotlinTest = "1.7.21"
5459
testImplementation("org.jetbrains.kotlin:kotlin-test:$versionKotlinTest")
5560

61+
testImplementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1")
62+
testImplementation("com.github.Ricky12Awesome:json-schema-serialization:0.9.9")
63+
testImplementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0")
5664
}
5765

5866
tasks.test {

src/main/kotlin/io/github/smiley4/ktorswaggerui/SwaggerController.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.github.smiley4.ktorswaggerui
22

3-
import io.github.smiley4.ktorswaggerui.dsl.SwaggerUI
3+
import io.github.smiley4.ktorswaggerui.dsl.SwaggerUIDsl
44
import io.github.smiley4.ktorswaggerui.dsl.SwaggerUiSort
55
import io.ktor.http.ContentType
66
import io.ktor.http.HttpStatusCode
@@ -15,7 +15,7 @@ class SwaggerController(
1515
private val swaggerWebjarVersion: String,
1616
private val apiSpecUrl: String,
1717
private val jsonSpecProvider: () -> String,
18-
private val swaggerUiConfig: SwaggerUI
18+
private val swaggerUiConfig: SwaggerUIDsl
1919
) {
2020

2121
suspend fun serveOpenApiSpec(call: ApplicationCall) {

src/main/kotlin/io/github/smiley4/ktorswaggerui/SwaggerPlugin.kt

Lines changed: 113 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
package io.github.smiley4.ktorswaggerui
22

3-
import io.github.smiley4.ktorswaggerui.specbuilder.ApiSpecBuilder
4-
import io.ktor.server.application.ApplicationStarted
5-
import io.ktor.server.application.createApplicationPlugin
6-
import io.ktor.server.application.hooks.MonitoringEvent
7-
import io.ktor.server.application.install
8-
import io.ktor.server.application.pluginOrNull
9-
import io.ktor.server.webjars.Webjars
3+
import io.github.smiley4.ktorswaggerui.spec.openapi.*
4+
import io.github.smiley4.ktorswaggerui.spec.route.RouteCollector
5+
import io.github.smiley4.ktorswaggerui.spec.route.RouteDocumentationMerger
6+
import io.github.smiley4.ktorswaggerui.spec.route.RouteMeta
7+
import io.github.smiley4.ktorswaggerui.spec.schema.SchemaBuilder
8+
import io.github.smiley4.ktorswaggerui.spec.schema.SchemaContext
9+
import io.github.smiley4.ktorswaggerui.spec.schema.SchemaContextBuilder
10+
import io.ktor.server.application.*
11+
import io.ktor.server.application.hooks.*
12+
import io.ktor.server.routing.*
13+
import io.ktor.server.webjars.*
14+
import io.swagger.v3.core.util.Json
1015

1116
/**
1217
* This version must match the version of the gradle dependency
@@ -21,7 +26,9 @@ val SwaggerUI = createApplicationPlugin(name = "SwaggerUI", createConfiguration
2126
if (application.pluginOrNull(Webjars) == null) {
2227
application.install(Webjars)
2328
}
24-
apiSpecJson = ApiSpecBuilder().build(application, pluginConfig)
29+
val routes = routes(application, pluginConfig)
30+
val schemaContext = schemaContext(pluginConfig, routes)
31+
apiSpecJson = Json.pretty(builder(pluginConfig, schemaContext).build(routes))
2532
}
2633

2734
SwaggerRouting(
@@ -31,3 +38,101 @@ val SwaggerUI = createApplicationPlugin(name = "SwaggerUI", createConfiguration
3138
) { apiSpecJson }.setup(application)
3239

3340
}
41+
42+
private fun routes(application: Application, pluginConfig: SwaggerUIPluginConfig): List<RouteMeta> {
43+
return RouteCollector(RouteDocumentationMerger())
44+
.collectRoutes({ application.plugin(Routing) }, pluginConfig)
45+
.toList()
46+
}
47+
48+
private fun schemaContext(pluginConfig: SwaggerUIPluginConfig, routes: List<RouteMeta>): SchemaContext {
49+
return SchemaContextBuilder(
50+
config = pluginConfig,
51+
schemaBuilder = SchemaBuilder(
52+
definitionsField = pluginConfig.encodingConfig.schemaDefinitionsField,
53+
schemaEncoder = pluginConfig.encodingConfig.getSchemaEncoder()
54+
),
55+
).build(routes.toList())
56+
}
57+
58+
private fun builder(config: SwaggerUIPluginConfig, schemaContext: SchemaContext): OpenApiBuilder {
59+
return OpenApiBuilder(
60+
config = config,
61+
schemaContext = schemaContext,
62+
infoBuilder = InfoBuilder(
63+
contactBuilder = ContactBuilder(),
64+
licenseBuilder = LicenseBuilder()
65+
),
66+
serverBuilder = ServerBuilder(),
67+
tagBuilder = TagBuilder(
68+
externalDocumentationBuilder = ExternalDocumentationBuilder()
69+
),
70+
pathsBuilder = PathsBuilder(
71+
pathBuilder = PathBuilder(
72+
operationBuilder = OperationBuilder(
73+
operationTagsBuilder = OperationTagsBuilder(config),
74+
parameterBuilder = ParameterBuilder(schemaContext),
75+
requestBodyBuilder = RequestBodyBuilder(
76+
contentBuilder = ContentBuilder(
77+
schemaContext = schemaContext,
78+
exampleBuilder = ExampleBuilder(
79+
config = config
80+
),
81+
headerBuilder = HeaderBuilder(schemaContext)
82+
)
83+
),
84+
responsesBuilder = ResponsesBuilder(
85+
responseBuilder = ResponseBuilder(
86+
headerBuilder = HeaderBuilder(schemaContext),
87+
contentBuilder = ContentBuilder(
88+
schemaContext = schemaContext,
89+
exampleBuilder = ExampleBuilder(
90+
config = config
91+
),
92+
headerBuilder = HeaderBuilder(schemaContext)
93+
)
94+
),
95+
config = config
96+
),
97+
securityRequirementsBuilder = SecurityRequirementsBuilder(config),
98+
)
99+
)
100+
),
101+
componentsBuilder = ComponentsBuilder(
102+
config = config,
103+
securitySchemesBuilder = SecuritySchemesBuilder(
104+
oAuthFlowsBuilder = OAuthFlowsBuilder()
105+
)
106+
)
107+
)
108+
}
109+
110+
111+
112+
113+
114+
115+
116+
117+
118+
119+
120+
121+
122+
123+
124+
125+
126+
127+
128+
129+
130+
131+
132+
133+
134+
135+
136+
137+
138+

src/main/kotlin/io/github/smiley4/ktorswaggerui/SwaggerRouting.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.github.smiley4.ktorswaggerui
22

3-
import io.github.smiley4.ktorswaggerui.dsl.SwaggerUI
3+
import io.github.smiley4.ktorswaggerui.dsl.SwaggerUIDsl
44
import io.ktor.server.application.Application
55
import io.ktor.server.application.call
66
import io.ktor.server.auth.authenticate
@@ -16,7 +16,7 @@ import mu.KotlinLogging
1616
* Registers and handles routes required for the swagger-ui
1717
*/
1818
class SwaggerRouting(
19-
private val swaggerUiConfig: SwaggerUI,
19+
private val swaggerUiConfig: SwaggerUIDsl,
2020
appConfig: ApplicationConfig,
2121
swaggerWebjarVersion: String,
2222
jsonSpecProvider: () -> String

0 commit comments

Comments
 (0)