Skip to content

Commit a35e1a0

Browse files
committed
Changed parameter handling behavior
Translation seems to be useless, the spec is confusing Made system to properly parse and describe parameters according to OpenAPI 3 spec
1 parent d79fe21 commit a35e1a0

File tree

20 files changed

+434
-24
lines changed

20 files changed

+434
-24
lines changed
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
package com.papsign.ktor.openapigen.annotations.parameters
22

33
import com.papsign.ktor.openapigen.openapi.ParameterLocation
4+
import com.papsign.ktor.openapigen.parameters.PathParamStyle
45

56
@Target(AnnotationTarget.FIELD, AnnotationTarget.PROPERTY, AnnotationTarget.VALUE_PARAMETER)
67
@Retention(AnnotationRetention.RUNTIME)
78
@APIParam(ParameterLocation.path)
8-
annotation class PathParam(val description: String, val required: Boolean = true, val deprecated: Boolean = false)
9+
annotation class PathParam(
10+
val description: String,
11+
val style: PathParamStyle = PathParamStyle.simple,
12+
val explode: Boolean = false,
13+
val deprecated: Boolean = false
14+
)
Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
package com.papsign.ktor.openapigen.annotations.parameters
22

33
import com.papsign.ktor.openapigen.openapi.ParameterLocation
4+
import com.papsign.ktor.openapigen.parameters.QueryParamStyle
45

56
@Target(AnnotationTarget.FIELD, AnnotationTarget.PROPERTY, AnnotationTarget.VALUE_PARAMETER)
67
@Retention(AnnotationRetention.RUNTIME)
78
@APIParam(ParameterLocation.query)
8-
annotation class QueryParam(val description: String, val allowEmptyValues: Boolean = false, val required: Boolean = true, val deprecated: Boolean = false)
9+
annotation class QueryParam(
10+
val description: String,
11+
val style: QueryParamStyle = QueryParamStyle.form,
12+
val explode: Boolean = false,
13+
val allowEmptyValues: Boolean = false,
14+
val deprecated: Boolean = false
15+
)

src/main/kotlin/com/papsign/ktor/openapigen/modules/handlers/RequestHandlerModule.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import com.papsign.ktor.openapigen.classLogger
77
import com.papsign.ktor.openapigen.content.type.BodyParser
88
import com.papsign.ktor.openapigen.content.type.ContentTypeProvider
99
import com.papsign.ktor.openapigen.content.type.SelectedParser
10-
import com.papsign.ktor.openapigen.generator.ParamBuilder
10+
import com.papsign.ktor.openapigen.parameters.ParamBuilder
1111
import com.papsign.ktor.openapigen.modules.ModuleProvider
1212
import com.papsign.ktor.openapigen.modules.ofClass
1313
import com.papsign.ktor.openapigen.modules.openapi.OperationModule

src/main/kotlin/com/papsign/ktor/openapigen/modules/handlers/RouteHandler.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import com.papsign.ktor.openapigen.modules.providers.MethodProvider
1010
import com.papsign.ktor.openapigen.modules.providers.PathProvider
1111
import com.papsign.ktor.openapigen.openapi.Operation
1212
import com.papsign.ktor.openapigen.openapi.PathItem
13+
import com.papsign.ktor.openapigen.parameters.parsers.NoTranslation
14+
import com.papsign.ktor.openapigen.parameters.parsers.OpenAPIPathSegmentTranslator
15+
import com.papsign.ktor.openapigen.parameters.parsers.ParameterHandler
1316
import org.slf4j.Logger
1417
import org.slf4j.LoggerFactory
1518

@@ -21,7 +24,8 @@ object RouteHandler: HandlerModule {
2124
val methods = provider.ofClass<MethodProvider>()
2225
if (methods.size > 1) error("API cannot have two methods simultaneously: ${methods.map { it.method.value }}")
2326
val paths = provider.ofClass<PathProvider>()
24-
val path = "/${paths.map { it.path.trim('/') }.filter { it.isNotBlank() }.joinToString("/")}"
27+
val translator = getTranslator(provider)
28+
val path = "/${paths.flatMap { it.path.split('/').filter(String::isNotEmpty).map(translator::translateSegment) }.joinToString("/")}"
2529
val operationModules = provider.ofClass<OperationModule>()
2630
apiGen.api.paths.getOrPut(path) { PathItem() }.also {pathItem ->
2731
methods.forEach {
@@ -35,4 +39,11 @@ object RouteHandler: HandlerModule {
3539
}
3640
log.trace("Registered $path::${methods.map { it.method.value }} with OpenAPI description with ${provider.ofClass<SelectedModule>().map { it.module::class.simpleName }}")
3741
}
42+
43+
private fun getTranslator(provider: ModuleProvider<*>): OpenAPIPathSegmentTranslator {
44+
val translator = provider.ofClass<OpenAPIPathSegmentTranslator>()
45+
if (translator.size > 1) log.warn("Too many Path Segment Translators, choosing first: $translator")
46+
if (translator.isEmpty()) log.debug("No Path Segment Translator, choosing default")
47+
return translator.firstOrNull() ?: NoTranslation
48+
}
3849
}

src/main/kotlin/com/papsign/ktor/openapigen/modules/openapi/HandlerModule.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ package com.papsign.ktor.openapigen.modules.openapi
33
import com.papsign.ktor.openapigen.OpenAPIGen
44
import com.papsign.ktor.openapigen.modules.ModuleProvider
55
import com.papsign.ktor.openapigen.modules.OpenAPIModule
6+
import com.papsign.ktor.openapigen.parameters.parsers.ParameterHandler
67

78
interface HandlerModule: OpenAPIModule {
89
fun configure(apiGen: OpenAPIGen, provider: ModuleProvider<*>)
9-
}
10+
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.papsign.ktor.openapigen.modules.providers
22

3-
import com.papsign.ktor.openapigen.generator.ParamBuilder
3+
import com.papsign.ktor.openapigen.parameters.ParamBuilder
44
import com.papsign.ktor.openapigen.modules.OpenAPIModule
55
import com.papsign.ktor.openapigen.openapi.Parameter
66

77
interface ParameterProvider: OpenAPIModule {
88
fun getParameters(builder: ParamBuilder): List<Parameter<*>>
9-
}
9+
}

src/main/kotlin/com/papsign/ktor/openapigen/openapi/OpenAPIModels.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.papsign.ktor.openapigen.openapi
22

3+
import com.papsign.ktor.openapigen.parameters.ParameterStyle
4+
35
data class ExternalDocumentation(
46
var url: String,
57
var description: String? = null
@@ -14,7 +16,9 @@ data class Parameter<T>(
1416
var allowEmptyValue: Boolean? = null,
1517
var schema: Schema<T>? = null,
1618
var example: T? = null,
17-
var examples: MutableMap<String, T>? = null
19+
var examples: MutableMap<String, T>? = null,
20+
var style: ParameterStyle? = null,
21+
var explode: Boolean = false
1822
// incomplete
1923
)
2024

src/main/kotlin/com/papsign/ktor/openapigen/generator/ParamBuilder.kt renamed to src/main/kotlin/com/papsign/ktor/openapigen/parameters/ParamBuilder.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.papsign.ktor.openapigen.generator
1+
package com.papsign.ktor.openapigen.parameters
22

33
import com.papsign.ktor.openapigen.OpenAPIGen
44
import com.papsign.ktor.openapigen.annotations.parameters.PathParam
@@ -32,13 +32,17 @@ class ParamBuilder(val apiGen: OpenAPIGen, val provider: ModuleProvider<*>) {
3232
it.description = description
3333
it.allowEmptyValue = allowEmptyValues
3434
it.deprecated = deprecated
35+
it.style = style
36+
it.explode = explode
3537
}
3638
}
3739

3840
fun PathParam.createParam(param: KParameter): Parameter<*> {
3941
return createParam(param, apiParam.`in`) {
4042
it.description = description
4143
it.deprecated = deprecated
44+
it.style = style
45+
it.explode = explode
4246
}
4347
}
4448

@@ -52,4 +56,4 @@ class ParamBuilder(val apiGen: OpenAPIGen, val provider: ModuleProvider<*>) {
5256
config(it)
5357
}
5458
}
55-
}
59+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.papsign.ktor.openapigen.parameters
2+
3+
interface ParameterStyle {
4+
val name: String
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.papsign.ktor.openapigen.parameters
2+
3+
enum class PathParamStyle(val prefix: String): ParameterStyle {
4+
simple(""), label("."), matrix(";")
5+
}

0 commit comments

Comments
 (0)