Added OpenAPI / Swagger documentation

This commit is contained in:
dankito 2023-04-10 20:06:05 +02:00
parent 6a8ba4cadd
commit 4c3ffa8f5f
5 changed files with 70 additions and 10 deletions

View File

@ -35,6 +35,7 @@ dependencies {
implementation 'io.quarkus:quarkus-kotlin' implementation 'io.quarkus:quarkus-kotlin'
implementation 'io.quarkus:quarkus-resteasy' implementation 'io.quarkus:quarkus-resteasy'
implementation 'io.quarkus:quarkus-resteasy-jackson' implementation 'io.quarkus:quarkus-resteasy-jackson'
implementation 'io.quarkus:quarkus-smallrye-openapi'
api project(":EpcQrCode") api project(":EpcQrCode")

View File

@ -4,6 +4,12 @@ import net.codinux.banking.epcqrcode.EpcQrCodeConfig
import net.codinux.banking.epcqrcode.EpcQrCodeGenerator import net.codinux.banking.epcqrcode.EpcQrCodeGenerator
import net.codinux.banking.epcqrcode.rest.dto.GenerateEpcQrCodeRequestDto import net.codinux.banking.epcqrcode.rest.dto.GenerateEpcQrCodeRequestDto
import net.codinux.banking.epcqrcode.rest.dto.GenerateEpcQrCodeResponseDto import net.codinux.banking.epcqrcode.rest.dto.GenerateEpcQrCodeResponseDto
import org.eclipse.microprofile.openapi.annotations.Operation
import org.eclipse.microprofile.openapi.annotations.media.Content
import org.eclipse.microprofile.openapi.annotations.media.Schema
import org.eclipse.microprofile.openapi.annotations.parameters.RequestBody
import org.eclipse.microprofile.openapi.annotations.responses.APIResponse
import org.eclipse.microprofile.openapi.annotations.tags.Tag
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import javax.ws.rs.* import javax.ws.rs.*
import javax.ws.rs.core.MediaType import javax.ws.rs.core.MediaType
@ -11,6 +17,8 @@ import javax.ws.rs.core.Response
@Path("/epcqrcode/v1") @Path("/epcqrcode/v1")
@Produces(MediaType.APPLICATION_JSON)
@Tag(name = "EPC QR Code")
class EpcQrCodeResource { class EpcQrCodeResource {
companion object { companion object {
@ -21,15 +29,25 @@ class EpcQrCodeResource {
protected val epcQrCodeGenerator = EpcQrCodeGenerator() protected val epcQrCodeGenerator = EpcQrCodeGenerator()
@Operation(summary = "Creates a EPC QR code (also marketed as GiroCode, scan2Code, ...)")
@APIResponse(responseCode = "200", description = "The generated EPC QR Code",
content = [ Content(mediaType = "application/json", schema = Schema(implementation = GenerateEpcQrCodeResponseDto::class)) ])
@APIResponse(responseCode = "500", description = "An internal error occurred")
@GET @GET
@Produces(MediaType.APPLICATION_JSON)
fun createEpcQrCodeGet(@BeanParam request: GenerateEpcQrCodeRequestDto): Response { fun createEpcQrCodeGet(@BeanParam request: GenerateEpcQrCodeRequestDto): Response {
return handleJsonRequest(request) return handleJsonRequest(request)
} }
@Operation(summary = "Creates a EPC QR code (also marketed as GiroCode, scan2Code, ...)")
@APIResponse(responseCode = "200", description = "The generated EPC QR Code",
content = [ Content(mediaType = "application/json", schema = Schema(implementation = GenerateEpcQrCodeResponseDto::class)) ])
@APIResponse(responseCode = "500", description = "An internal error occurred")
@POST @POST
@Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON)
fun createEpcQrCodePost(request: GenerateEpcQrCodeRequestDto): Response { fun createEpcQrCodePost(
@RequestBody(content = [ Content(schema = Schema(implementation = GenerateEpcQrCodeRequestDto::class)) ])
request: GenerateEpcQrCodeRequestDto
): Response {
return handleJsonRequest(request) return handleJsonRequest(request)
} }

View File

@ -3,6 +3,8 @@ package net.codinux.banking.epcqrcode.rest.dto
import net.codinux.banking.epcqrcode.EpcQrCode import net.codinux.banking.epcqrcode.EpcQrCode
import net.codinux.banking.epcqrcode.EpcQrCodeCharacterSet import net.codinux.banking.epcqrcode.EpcQrCodeCharacterSet
import net.codinux.banking.epcqrcode.ImageFormat import net.codinux.banking.epcqrcode.ImageFormat
import org.eclipse.microprofile.openapi.annotations.media.Schema
import org.eclipse.microprofile.openapi.annotations.parameters.Parameter
import javax.ws.rs.DefaultValue import javax.ws.rs.DefaultValue
import javax.ws.rs.QueryParam import javax.ws.rs.QueryParam
@ -10,33 +12,51 @@ import javax.ws.rs.QueryParam
class GenerateEpcQrCodeRequestDto { class GenerateEpcQrCodeRequestDto {
@QueryParam("receiverName") @QueryParam("receiverName")
@Parameter(description = "The name of the receiver of this money transfer (that is in most cases your name or your company's name)", required = true)
@Schema(description = "The name of the receiver of this money transfer (that is in most cases your name or your company's name)", required = true)
var receiverName: String = "" var receiverName: String = ""
@QueryParam("bic")
var bic: String? = null
@QueryParam("iban") @QueryParam("iban")
@Parameter(description = "Receiver's IBAN", required = true)
@Schema(description = "Receiver's IBAN", required = true)
var iban: String = "" var iban: String = ""
@QueryParam("bic")
@Parameter(description = "Receiver's BIC (optional, only required for transfers to foreign countries)", required = false)
@Schema(description = "Receiver's BIC (optional, only required for transfers to foreign countries)", required = false)
var bic: String? = null
@QueryParam("amount") @QueryParam("amount")
@Parameter(description = "The amount to transfer (by standard optional, but highly recommended)", required = false)
@Schema(description = "The amount to transfer (by standard optional, but highly recommended)", required = false)
var amount: String? = null var amount: String? = null
@QueryParam("reference") @QueryParam("reference")
@Parameter(description = "The reference or usage of this money transfer", required = false)
@Schema(description = "The reference or usage of this money transfer", required = false)
var reference: String? = null var reference: String? = null
@QueryParam("noteToUser") @QueryParam("noteToUser")
@Parameter(description = "An optional note that should be displayed to user (not implemented by all decoding applications)", required = false)
@Schema(description = "An optional note that should be displayed to user (not implemented by all decoding applications)", required = false)
var noteToUser: String? = null var noteToUser: String? = null
@DefaultValue("" + EpcQrCode.DefaultHeightAndWidth) @DefaultValue("" + EpcQrCode.DefaultHeightAndWidth)
@QueryParam("imageHeightAndWidth") @QueryParam("imageHeightAndWidth")
@Parameter(description = "Height and width of the returned QR code", required = false)
@Schema(description = "Height and width of the returned QR code", defaultValue = "" + EpcQrCode.DefaultHeightAndWidth, required = false)
var imageHeightAndWidth: Int = EpcQrCode.DefaultHeightAndWidth var imageHeightAndWidth: Int = EpcQrCode.DefaultHeightAndWidth
@DefaultValue("PNG") @DefaultValue("PNG")
@QueryParam("imageFormat") @QueryParam("imageFormat")
@Parameter(description = "The format of the returned QR code image", required = false)
@Schema(description = "The format of the returned QR code image", defaultValue = "PNG", required = false)
var imageFormat: ImageFormat = ImageFormat.PNG var imageFormat: ImageFormat = ImageFormat.PNG
@DefaultValue("UTF_8") @DefaultValue("UTF_8")
@QueryParam("encoding") @QueryParam("encoding")
@Parameter(description = "The charset used for encoding", required = false)
@Schema(description = "The charset used for encoding", defaultValue = "UTF_8", required = false)
var encoding: EpcQrCodeCharacterSet = EpcQrCodeCharacterSet.UTF_8 var encoding: EpcQrCodeCharacterSet = EpcQrCodeCharacterSet.UTF_8
} }

View File

@ -1,7 +1,10 @@
package net.codinux.banking.epcqrcode.rest.dto package net.codinux.banking.epcqrcode.rest.dto
import org.eclipse.microprofile.openapi.annotations.media.Schema
class GenerateEpcQrCodeResponseDto( class GenerateEpcQrCodeResponseDto(
// JAX-RS automatically encodes ByteArray to Base64 // JAX-RS automatically encodes ByteArray to Base64
@Schema(description = "The Base64 encoded generated EPC QR Code")
val qrCodeBase64Encoded: ByteArray val qrCodeBase64Encoded: ByteArray
) )

View File

@ -1,10 +1,10 @@
quarkus.http.cors=true
# HTTP port settings (for production and dev) # HTTP port settings (for production and dev)
quarkus.http.port=8080 quarkus.http.port=8080
%dev.quarkus.http.port=6543 %dev.quarkus.http.port=6543
quarkus.http.cors=true
# disable this output: # disable this output:
# Press [h] for more options> # Press [h] for more options>
@ -17,6 +17,24 @@ quarkus.console.disable-input=true
# Quarkus Native settings # Quarkus Native settings
quarkus.native.enable-https-url-handler=true quarkus.native.enable-https-url-handler=true
quarkus.native.enable-all-security-services=true quarkus.native.enable-all-security-services=true
# so that on server endpoints like /openapi, /swagger-ui, /health can be reached under /epcqrcode (under /q/ it's not reachable on server)
quarkus.http.non-application-root-path=/epcqrcode
# OpenAPI and Swagger-UI
quarkus.swagger-ui.always-include=true
quarkus.swagger-ui.theme=flattop
quarkus.swagger-ui.display-request-duration=true
quarkus.smallrye-openapi.info-title=EPC QR Code REST API
quarkus.smallrye-openapi.info-version=1.0.0
quarkus.smallrye-openapi.info-description=REST API to generate EPC QR codes (also marketed as GiroCode, scan2Code, ...)
quarkus.smallrye-openapi.info-contact-email=dev@codinux.net
quarkus.smallrye-openapi.info-contact-name=codinux GmbH & Co. KG
quarkus.smallrye-openapi.info-contact-url=https://codinux.net/