All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.javalin.plugin.openapi.dsl.DocumentedResponse.kt Maven / Gradle / Ivy

The newest version!
package io.javalin.plugin.openapi.dsl

import io.javalin.http.HttpCode
import io.javalin.plugin.openapi.external.findSchema
import io.javalin.plugin.openapi.external.mediaTypeRef
import io.swagger.v3.oas.models.Components
import io.swagger.v3.oas.models.media.ArraySchema
import io.swagger.v3.oas.models.media.ComposedSchema
import io.swagger.v3.oas.models.responses.ApiResponse

class DocumentedResponse(
        val status: String,
        val content: List
)

fun DocumentedResponse.getStatusMessage() = status.toIntOrNull()?.let { HttpCode.forStatus(it)?.message } ?: ""

fun ApiResponse.applyDocumentedResponse(documentedResponse: DocumentedResponse) {
    description = description ?: documentedResponse.getStatusMessage()

    val contentToApply = arrayListOf()
    documentedResponse.content.groupBy { it.contentType }.forEach { (contentType, list) ->
        if (list.size > 1) {
            val composedList = list.map {
                val schema = if (!it.isNonRefType()) mediaTypeRef(it.fromType).schema
                else findSchema(it.fromType)?.main
                if (it.isArray) ArraySchema().items(schema) else schema
            }

            val schema = ComposedSchema().apply {
                oneOf(composedList)
            }
            val content = DocumentedContent(schema, contentType)
            contentToApply.add(content)
        } else {
            contentToApply.addAll(list)
        }
    }

    if (contentToApply.isNotEmpty()) {
        updateContent {
            contentToApply.forEach { applyDocumentedContent(it) }
        }
    }

}

fun Components.applyDocumentedResponse(documentedResponse: DocumentedResponse) {
    documentedResponse.content.forEach { applyDocumentedContent(it) }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy