@@ -3,10 +3,17 @@ package io.realworld.app.config
33import com.fasterxml.jackson.databind.SerializationFeature
44import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
55import io.javalin.Javalin
6+ import io.javalin.core.plugin.Plugin
7+ import io.javalin.core.security.SecurityUtil.roles
68import io.javalin.plugin.json.JavalinJackson
9+ import io.javalin.plugin.openapi.OpenApiOptions
10+ import io.javalin.plugin.openapi.OpenApiPlugin
11+ import io.javalin.plugin.openapi.ui.SwaggerOptions
712import io.realworld.app.config.ModulesConfig.allModules
813import io.realworld.app.web.ErrorExceptionMapping
914import io.realworld.app.web.Router
15+ import io.swagger.v3.oas.models.info.Info
16+ import org.eclipse.jetty.server.Server
1017import org.koin.core.KoinProperties
1118import org.koin.standalone.KoinComponent
1219import org.koin.standalone.StandAloneContext
@@ -23,24 +30,26 @@ class AppConfig : KoinComponent {
2330 allModules,
2431 KoinProperties (true , true )
2532 )
26- return Javalin .create()
27- .also { app ->
28- this .configureMapper()
29- app.config!! .apply {
30- this .enableWebjars()
31- this .enableCorsForAllOrigins()
32- this .contextPath = getProperty(" context" )
33- }
34- app.events {
35- it.serverStopping {
36- StandAloneContext .stopKoin()
37- }
38- }
39- authConfig.configure(app)
40- router.register(app)
41- ErrorExceptionMapping .register(app)
42- app.server()!! .serverPort = getProperty(" server_port" )
33+ this .configureMapper()
34+ val app = Javalin .create { config ->
35+ config.apply {
36+ enableWebjars()
37+ enableCorsForAllOrigins()
38+ contextPath = getProperty(" context" )
39+ registerPlugin(getConfiguredOpenApiPlugin())
40+ server {
41+ Server (getProperty(" server_port" ) as Int )
4342 }
43+ }
44+ }.events {
45+ it.serverStopping {
46+ StandAloneContext .stopKoin()
47+ }
48+ }
49+ authConfig.configure(app)
50+ router.register(app)
51+ ErrorExceptionMapping .register(app)
52+ return app
4453 }
4554
4655 private fun configureMapper () {
@@ -52,5 +61,22 @@ class AppConfig : KoinComponent {
5261 .configure(SerializationFeature .WRITE_DATES_WITH_ZONE_ID , true )
5362 )
5463 }
64+
65+ fun getConfiguredOpenApiPlugin () = OpenApiPlugin (
66+ OpenApiOptions (
67+ Info ().apply {
68+ title(" Conduit" )
69+ version(" 1.0" )
70+ description(
71+ " |-\n " +
72+ " Collection for testing the Conduit API\n " +
73+ " https://github.com/Rudge/kotlin-javalin-realworld-example-app" )
74+ }
75+ ).apply {
76+ path(" /swagger-docs" ) // endpoint for OpenAPI json
77+ swagger(SwaggerOptions (" /swagger-ui" )) // endpoint for swagger-ui
78+ roles(roles(Roles .ANYONE , Roles .AUTHENTICATED ))
79+ }
80+ )
5581}
5682
0 commit comments