feat: add operationId method info (#106)

This commit is contained in:
Geir Sagberg
2021-11-25 16:00:08 +01:00
committed by GitHub
parent d2165d23bf
commit dd780ad29d
8 changed files with 143 additions and 11 deletions

View File

@ -1,5 +1,11 @@
# Changelog # Changelog
## [1.10.0] - November 25th, 2021
### Changed
- Added `operationId` parameter to `MethodInfo`
## [1.9.2] - October 24th, 2021 ## [1.9.2] - October 24th, 2021
### Changed ### Changed

View File

@ -210,6 +210,7 @@ fun Application.mainModule() {
val simpleGetInfo = GetInfo<Unit, ExampleResponse>( val simpleGetInfo = GetInfo<Unit, ExampleResponse>(
summary = "Example Parameters", summary = "Example Parameters",
description = "A test for setting parameter examples", description = "A test for setting parameter examples",
operationId = "getExamples",
responseInfo = ResponseInfo( responseInfo = ResponseInfo(
status = 200, status = 200,
description = "nice", description = "nice",

View File

@ -1,5 +1,5 @@
# Kompendium # Kompendium
project.version=1.9.2 project.version=1.10.0
# Kotlin # Kotlin
kotlin.code.style=official kotlin.code.style=official
# Gradle # Gradle

View File

@ -49,6 +49,7 @@ object MethodParser {
) = OpenApiSpecPathItemOperation( ) = OpenApiSpecPathItemOperation(
summary = info.summary, summary = info.summary,
description = info.description, description = info.description,
operationId = info.operationId,
tags = info.tags, tags = info.tags,
deprecated = info.deprecated, deprecated = info.deprecated,
parameters = paramType.toParameterSpec(), parameters = paramType.toParameterSpec(),

View File

@ -11,6 +11,7 @@ sealed class MethodInfo<TParam, TResp>(
open val canThrow: Set<KClass<*>> = emptySet(), open val canThrow: Set<KClass<*>> = emptySet(),
open val responseInfo: ResponseInfo<TResp>? = null, open val responseInfo: ResponseInfo<TResp>? = null,
open val parameterExamples: Map<String, TParam> = emptyMap(), open val parameterExamples: Map<String, TParam> = emptyMap(),
open val operationId: String? = null
) { ) {
data class GetInfo<TParam, TResp>( data class GetInfo<TParam, TResp>(
@ -21,7 +22,8 @@ sealed class MethodInfo<TParam, TResp>(
override val deprecated: Boolean = false, override val deprecated: Boolean = false,
override val securitySchemes: Set<String> = emptySet(), override val securitySchemes: Set<String> = emptySet(),
override val canThrow: Set<KClass<*>> = emptySet(), override val canThrow: Set<KClass<*>> = emptySet(),
override val parameterExamples: Map<String, TParam> = emptyMap() override val parameterExamples: Map<String, TParam> = emptyMap(),
override val operationId: String? = null
) : MethodInfo<TParam, TResp>( ) : MethodInfo<TParam, TResp>(
summary = summary, summary = summary,
description = description, description = description,
@ -30,7 +32,8 @@ sealed class MethodInfo<TParam, TResp>(
securitySchemes = securitySchemes, securitySchemes = securitySchemes,
canThrow = canThrow, canThrow = canThrow,
responseInfo = responseInfo, responseInfo = responseInfo,
parameterExamples = parameterExamples parameterExamples = parameterExamples,
operationId = operationId
) )
data class PostInfo<TParam, TReq, TResp>( data class PostInfo<TParam, TReq, TResp>(
@ -42,7 +45,8 @@ sealed class MethodInfo<TParam, TResp>(
override val deprecated: Boolean = false, override val deprecated: Boolean = false,
override val securitySchemes: Set<String> = emptySet(), override val securitySchemes: Set<String> = emptySet(),
override val canThrow: Set<KClass<*>> = emptySet(), override val canThrow: Set<KClass<*>> = emptySet(),
override val parameterExamples: Map<String, TParam> = emptyMap() override val parameterExamples: Map<String, TParam> = emptyMap(),
override val operationId: String? = null
) : MethodInfo<TParam, TResp>( ) : MethodInfo<TParam, TResp>(
summary = summary, summary = summary,
description = description, description = description,
@ -51,7 +55,8 @@ sealed class MethodInfo<TParam, TResp>(
securitySchemes = securitySchemes, securitySchemes = securitySchemes,
canThrow = canThrow, canThrow = canThrow,
responseInfo = responseInfo, responseInfo = responseInfo,
parameterExamples = parameterExamples parameterExamples = parameterExamples,
operationId = operationId
) )
data class PutInfo<TParam, TReq, TResp>( data class PutInfo<TParam, TReq, TResp>(
@ -63,7 +68,8 @@ sealed class MethodInfo<TParam, TResp>(
override val deprecated: Boolean = false, override val deprecated: Boolean = false,
override val securitySchemes: Set<String> = emptySet(), override val securitySchemes: Set<String> = emptySet(),
override val canThrow: Set<KClass<*>> = emptySet(), override val canThrow: Set<KClass<*>> = emptySet(),
override val parameterExamples: Map<String, TParam> = emptyMap() override val parameterExamples: Map<String, TParam> = emptyMap(),
override val operationId: String? = null
) : MethodInfo<TParam, TResp>( ) : MethodInfo<TParam, TResp>(
summary = summary, summary = summary,
description = description, description = description,
@ -71,7 +77,8 @@ sealed class MethodInfo<TParam, TResp>(
deprecated = deprecated, deprecated = deprecated,
securitySchemes = securitySchemes, securitySchemes = securitySchemes,
canThrow = canThrow, canThrow = canThrow,
parameterExamples = parameterExamples parameterExamples = parameterExamples,
operationId = operationId
) )
data class DeleteInfo<TParam, TResp>( data class DeleteInfo<TParam, TResp>(
@ -82,7 +89,8 @@ sealed class MethodInfo<TParam, TResp>(
override val deprecated: Boolean = false, override val deprecated: Boolean = false,
override val securitySchemes: Set<String> = emptySet(), override val securitySchemes: Set<String> = emptySet(),
override val canThrow: Set<KClass<*>> = emptySet(), override val canThrow: Set<KClass<*>> = emptySet(),
override val parameterExamples: Map<String, TParam> = emptyMap() override val parameterExamples: Map<String, TParam> = emptyMap(),
override val operationId: String? = null
) : MethodInfo<TParam, TResp>( ) : MethodInfo<TParam, TResp>(
summary = summary, summary = summary,
description = description, description = description,
@ -90,6 +98,7 @@ sealed class MethodInfo<TParam, TResp>(
deprecated = deprecated, deprecated = deprecated,
securitySchemes = securitySchemes, securitySchemes = securitySchemes,
canThrow = canThrow, canThrow = canThrow,
parameterExamples = parameterExamples parameterExamples = parameterExamples,
operationId = operationId
) )
} }

View File

@ -46,6 +46,7 @@ import io.bkbn.kompendium.util.trailingSlash
import io.bkbn.kompendium.util.undeclaredType import io.bkbn.kompendium.util.undeclaredType
import io.bkbn.kompendium.util.withDefaultParameter import io.bkbn.kompendium.util.withDefaultParameter
import io.bkbn.kompendium.util.withExamples import io.bkbn.kompendium.util.withExamples
import io.bkbn.kompendium.util.withOperationId
internal class KompendiumTest { internal class KompendiumTest {
@ -139,7 +140,6 @@ internal class KompendiumTest {
} }
} }
@Test @Test
fun `Notarized put does not interrupt the pipeline`() { fun `Notarized put does not interrupt the pipeline`() {
withTestApplication({ withTestApplication({
@ -363,6 +363,22 @@ internal class KompendiumTest {
} }
} }
@Test
fun `Can add operationId`() {
withTestApplication({
jacksonConfigModule()
docs()
withOperationId()
}) {
// do
val json = handleRequest(HttpMethod.Get, "/openapi.json").response.content
// expect
val expected = getFileSnapshot("notarized_get_with_operation_id.json").trim()
assertEquals(expected, json, "The received json spec should match the expected content")
}
}
@Test @Test
fun `Generates the expected redoc`() { fun `Generates the expected redoc`() {
withTestApplication({ withTestApplication({
@ -607,5 +623,4 @@ internal class KompendiumTest {
redoc(oas) redoc(oas)
} }
} }
} }

View File

@ -265,6 +265,18 @@ fun Application.withDefaultParameter() {
} }
} }
fun Application.withOperationId(){
routing {
route("/test") {
notarizedGet(
info = TestResponseInfo.testGetInfo.copy(operationId = "getTest")
){
call.respond(HttpStatusCode.OK)
}
}
}
}
fun Application.nonRequiredParamsGet() { fun Application.nonRequiredParamsGet() {
routing { routing {
route("/test/optional") { route("/test/optional") {

View File

@ -0,0 +1,88 @@
{
"openapi" : "3.0.3",
"info" : {
"title" : "Test API",
"version" : "1.33.7",
"description" : "An amazing, fully-ish 😉 generated API spec",
"termsOfService" : "https://example.com",
"contact" : {
"name" : "Homer Simpson",
"url" : "https://gph.is/1NPUDiM",
"email" : "chunkylover53@aol.com"
},
"license" : {
"name" : "MIT",
"url" : "https://github.com/bkbnio/kompendium/blob/main/LICENSE"
}
},
"servers" : [ {
"url" : "https://myawesomeapi.com",
"description" : "Production instance of my API"
}, {
"url" : "https://staging.myawesomeapi.com",
"description" : "Where the fun stuff happens"
} ],
"paths" : {
"/test" : {
"get" : {
"tags" : [ ],
"summary" : "Another get test",
"description" : "testing more",
"operationId" : "getTest",
"parameters" : [ {
"name" : "a",
"in" : "path",
"schema" : {
"type" : "string"
},
"required" : true,
"deprecated" : false
}, {
"name" : "aa",
"in" : "query",
"schema" : {
"type" : "integer",
"format" : "int32"
},
"required" : true,
"deprecated" : false
} ],
"responses" : {
"200" : {
"description" : "A Successful Endeavor",
"content" : {
"application/json" : {
"schema" : {
"$ref" : "#/components/schemas/TestResponse"
}
}
}
}
},
"deprecated" : false
}
}
},
"components" : {
"schemas" : {
"String" : {
"type" : "string"
},
"TestResponse" : {
"type" : "object",
"properties" : {
"c" : {
"$ref" : "#/components/schemas/String"
}
}
},
"Int" : {
"type" : "integer",
"format" : "int32"
}
},
"securitySchemes" : { }
},
"security" : [ ],
"tags" : [ ]
}