Skip to content

Commit ec898a5

Browse files
authored
Merge pull request #88 from kkalisz/jwt-improvements
Improvements for jwt
2 parents 4c62c01 + bcc015a commit ec898a5

File tree

6 files changed

+61
-25
lines changed

6 files changed

+61
-25
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.papsign.ktor.openapigen
2+
3+
data class SerializationSettings(
4+
val skipEmptyMap: Boolean = false,
5+
val skipEmptyList: Boolean = false,
6+
val skipEmptyValue: Boolean = false
7+
)

src/main/kotlin/com/papsign/ktor/openapigen/Util.kt

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

3+
import com.papsign.ktor.openapigen.model.DataModel
34
import io.ktor.application.Application
45
import io.ktor.application.feature
56
import org.slf4j.Logger
@@ -14,4 +15,25 @@ internal fun Any.classLogger(): Logger {
1415

1516
internal inline fun <reified T> classLogger(): Logger {
1617
return LoggerFactory.getLogger(T::class.java)
17-
}
18+
}
19+
20+
fun Map<String, *>.cleanEmptyValues(serializationSettings: SerializationSettings = SerializationSettings()): Map<String, *> {
21+
return filterValues {
22+
when (it) {
23+
is Map<*, *> -> it.isNotEmpty() || serializationSettings.skipEmptyMap
24+
is Collection<*> -> it.isNotEmpty() || serializationSettings.skipEmptyList
25+
else -> it != null || serializationSettings.skipEmptyValue
26+
}
27+
}
28+
}
29+
30+
fun convertToValue(value: Any?, serializationSettings: SerializationSettings = SerializationSettings()): Any? {
31+
return when (value) {
32+
is DataModel -> value.serialize()
33+
is Map<*, *> -> value.entries.associate { (key, value) -> Pair(key.toString(), convertToValue(value, serializationSettings)) }
34+
.cleanEmptyValues(serializationSettings)
35+
is Iterable<*> -> value.map { convertToValue(it, serializationSettings) }
36+
else -> value
37+
}
38+
}
39+
Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,15 @@
11
package com.papsign.ktor.openapigen.model
22

3-
import com.papsign.ktor.openapigen.annotations.mapping.openAPIName
3+
import com.papsign.ktor.openapigen.cleanEmptyValues
4+
import com.papsign.ktor.openapigen.convertToValue
45
import kotlin.reflect.KProperty1
56
import kotlin.reflect.full.memberProperties
67

78
interface DataModel {
89

910
fun serialize(): Map<String, Any?> {
10-
fun Map<String, *>.clean(): Map<String, *> {
11-
return filterValues {
12-
when (it) {
13-
is Map<*, *> -> it.isNotEmpty()
14-
is Collection<*> -> it.isNotEmpty()
15-
else -> it != null
16-
}
17-
}
18-
}
19-
fun cvt(value: Any?): Any? {
20-
return when (value) {
21-
is DataModel -> value.serialize()
22-
is Map<*, *> -> value.entries.associate { (key, value) -> Pair(key.toString(), cvt(value)) }.clean()
23-
is Iterable<*> -> value.map { cvt(it) }
24-
else -> value
25-
}
26-
}
2711
return this::class.memberProperties.associateBy { it.name }.mapValues { (_, prop) ->
28-
cvt((prop as KProperty1<DataModel, *>).get(this))
29-
}.clean()
12+
convertToValue((prop as KProperty1<DataModel, *>).get(this))
13+
}.cleanEmptyValues()
3014
}
3115
}
Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package com.papsign.ktor.openapigen.model.security
22

3+
import com.papsign.ktor.openapigen.SerializationSettings
4+
import com.papsign.ktor.openapigen.cleanEmptyValues
5+
import com.papsign.ktor.openapigen.convertToValue
6+
import com.papsign.ktor.openapigen.model.DataModel
37
import com.papsign.ktor.openapigen.model.Described
48

5-
class SecurityModel : MutableMap<String, List<*>> by mutableMapOf() {
9+
class SecurityModel : MutableMap<String, List<*>> by mutableMapOf(), DataModel {
610

711
operator fun <T> set(scheme: SecuritySchemeModel<T>, requirements: List<T>) where T: Enum<T>, T: Described {
812
this[scheme.name] = requirements
@@ -11,4 +15,11 @@ class SecurityModel : MutableMap<String, List<*>> by mutableMapOf() {
1115
fun <T> set(scheme: SecuritySchemeModel<T>) where T: Enum<T>, T: Described {
1216
this[scheme] = listOf()
1317
}
18+
19+
override fun serialize(): Map<String, Any?> {
20+
val serializationSettings = SerializationSettings(skipEmptyList = true)
21+
return this.mapValues { (_, prop) ->
22+
convertToValue(prop,serializationSettings)
23+
}.cleanEmptyValues(serializationSettings)
24+
}
1425
}

src/main/kotlin/com/papsign/ktor/openapigen/model/security/SecuritySchemeModel.kt

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

3+
import com.papsign.ktor.openapigen.cleanEmptyValues
4+
import com.papsign.ktor.openapigen.convertToValue
35
import com.papsign.ktor.openapigen.model.DataModel
46
import com.papsign.ktor.openapigen.model.Described
7+
import kotlin.reflect.KProperty1
8+
import kotlin.reflect.full.memberProperties
59

610
data class SecuritySchemeModel<TScope> constructor(
711
val type: SecuritySchemeType,
@@ -11,4 +15,11 @@ data class SecuritySchemeModel<TScope> constructor(
1115
val bearerFormat: String? = null,
1216
val flows: FlowsModel<TScope>? = null,
1317
val openIdConnectUrl: String? = null
14-
): DataModel where TScope : Enum<TScope>, TScope : Described
18+
): DataModel where TScope : Enum<TScope>, TScope : Described{
19+
20+
override fun serialize(): Map<String, Any?> {
21+
return this::class.memberProperties.associateBy { it.name }.mapValues<String, KProperty1<out SecuritySchemeModel<TScope>, Any?>, Any?> { (_, prop) ->
22+
convertToValue((prop as KProperty1<DataModel, *>).get(this))
23+
}.filter { it.key != "name" }.cleanEmptyValues()
24+
}
25+
}

src/test/kotlin/JwtAuthDocumentationGenerationTest.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,13 @@ internal class JwtAuthDocumentationGenerationTest {
2020
assertTrue(response.content!!.contains("\"securitySchemes\" : {\n" +
2121
" \"jwtAuth\" : {\n" +
2222
" \"bearerFormat\" : \"JWT\",\n" +
23-
" \"name\" : \"jwtAuth\",\n" +
2423
" \"scheme\" : \"bearer\",\n" +
2524
" \"type\" : \"http\"\n" +
2625
" }\n" +
2726
" }"))
28-
assertTrue(response.content!!.contains("\"security\" : [ { } ],"))
27+
assertTrue(response.content!!.contains("\"security\" : [ {\n" +
28+
" \"jwtAuth\" : [ ]\n" +
29+
" } ]"))
2930
}
3031
}
3132

0 commit comments

Comments
 (0)