From 98053a9c1cc2e94733bfdf84a0dafc161721e95c Mon Sep 17 00:00:00 2001 From: Carles Arnal Date: Wed, 12 Jun 2024 11:02:10 +0200 Subject: [PATCH 1/7] Add support for reactive in the server extension --- .../includes/server-getting-started.adoc | 9 + .../generator/deployment/CodegenConfig.java | 5 + .../codegen/ApicurioCodegenWrapper.java | 8 + server/integration-tests/pom.xml | 101 +- server/integration-tests/reactive/pom.xml | 109 ++ .../src/main/java/petstore/PetStoreImpl.java | 58 + .../src/main/resources/application.properties | 4 + .../resources/openapi/petstore-openapi.json | 0 .../src/test/java/it/PetStoreTest.java | 47 + server/integration-tests/resteasy/pom.xml | 109 ++ .../main/java/io/petstore/PetStoreImpl.java | 0 .../src/main/resources/application.properties | 4 + .../resources/openapi/petstore-openapi.json | 1225 +++++++++++++++++ .../server/generator/it/PetStoreTest.java | 0 .../src/main/resources/application.properties | 3 - 15 files changed, 1587 insertions(+), 95 deletions(-) create mode 100644 server/integration-tests/reactive/pom.xml create mode 100755 server/integration-tests/reactive/src/main/java/petstore/PetStoreImpl.java create mode 100755 server/integration-tests/reactive/src/main/resources/application.properties rename server/integration-tests/{ => reactive}/src/main/resources/openapi/petstore-openapi.json (100%) create mode 100755 server/integration-tests/reactive/src/test/java/it/PetStoreTest.java create mode 100644 server/integration-tests/resteasy/pom.xml rename server/integration-tests/{ => resteasy}/src/main/java/io/petstore/PetStoreImpl.java (100%) create mode 100755 server/integration-tests/resteasy/src/main/resources/application.properties create mode 100755 server/integration-tests/resteasy/src/main/resources/openapi/petstore-openapi.json rename server/integration-tests/{ => resteasy}/src/test/java/io/quarkiverse/openapi/server/generator/it/PetStoreTest.java (100%) delete mode 100755 server/integration-tests/src/main/resources/application.properties diff --git a/docs/modules/ROOT/pages/includes/server-getting-started.adoc b/docs/modules/ROOT/pages/includes/server-getting-started.adoc index 4912b8c3..08e545b2 100644 --- a/docs/modules/ROOT/pages/includes/server-getting-started.adoc +++ b/docs/modules/ROOT/pages/includes/server-getting-started.adoc @@ -10,6 +10,8 @@ Add the following dependency to your project's `pom.xml` file: ---- +Note that since this extension has not been yet released, you'll need a local build of the dependency. + You will also need to add or update the `quarkus-maven-plugin` configuration with the following: WARNING: You probably already have this configuration if you created your application with https://code.quarkus.io/[Code Quarkus]. That said, double-check your configuration not to add another `plugin` entry. @@ -55,6 +57,13 @@ If a base package name is not provided, it will be used the default `io.apicurio quarkus.openapi.generator.base-package=io.petstore ---- +By default, the extension generates non-reactive code. If you would like to change it, you can do it as follows: + +[source,properties] +---- +quarkus.openapi.generator.reactive=true +---- + Run `mvn compile` to generate your classes in `target/generated-sources/jaxrs` path: [source] diff --git a/server/deployment/src/main/java/io/quarkiverse/openapi/server/generator/deployment/CodegenConfig.java b/server/deployment/src/main/java/io/quarkiverse/openapi/server/generator/deployment/CodegenConfig.java index 8453d492..139c2c1f 100755 --- a/server/deployment/src/main/java/io/quarkiverse/openapi/server/generator/deployment/CodegenConfig.java +++ b/server/deployment/src/main/java/io/quarkiverse/openapi/server/generator/deployment/CodegenConfig.java @@ -10,6 +10,7 @@ public class CodegenConfig { private static final String CODEGEN_BASE_PACKAGE = CODEGEN_TIME_CONFIG_PREFIX + ".base-package"; private static final String CODEGEN_SPEC = CODEGEN_TIME_CONFIG_PREFIX + ".spec"; private static final String INPUT_BASE_DIR = CODEGEN_TIME_CONFIG_PREFIX + ".input-base-dir"; + private static final String CODEGEN_REACTIVE = CODEGEN_TIME_CONFIG_PREFIX + ".reactive"; public static String getBasePackagePropertyName() { return CODEGEN_BASE_PACKAGE; @@ -22,4 +23,8 @@ public static String getSpecPropertyName() { public static String getInputBaseDirPropertyName() { return INPUT_BASE_DIR; } + + public static String getCodegenReactive() { + return CODEGEN_REACTIVE; + } } diff --git a/server/deployment/src/main/java/io/quarkiverse/openapi/server/generator/deployment/codegen/ApicurioCodegenWrapper.java b/server/deployment/src/main/java/io/quarkiverse/openapi/server/generator/deployment/codegen/ApicurioCodegenWrapper.java index a1d467ff..2aac2a5a 100755 --- a/server/deployment/src/main/java/io/quarkiverse/openapi/server/generator/deployment/codegen/ApicurioCodegenWrapper.java +++ b/server/deployment/src/main/java/io/quarkiverse/openapi/server/generator/deployment/codegen/ApicurioCodegenWrapper.java @@ -1,6 +1,7 @@ package io.quarkiverse.openapi.server.generator.deployment.codegen; import static io.quarkiverse.openapi.server.generator.deployment.CodegenConfig.getBasePackagePropertyName; +import static io.quarkiverse.openapi.server.generator.deployment.CodegenConfig.getCodegenReactive; import java.io.File; import java.io.FileInputStream; @@ -38,6 +39,7 @@ public ApicurioCodegenWrapper(Config config, File outdir, JaxRsProjectSettings p this.outdir = outdir; this.projectSettings = projectSettings; this.projectSettings.setJavaPackage(getBasePackage(config)); + this.projectSettings.setReactive(getReactiveValue(config)); } public void generate(Path openApiResource) throws CodeGenException { @@ -110,6 +112,12 @@ private String getBasePackage(final Config config) { .orElse(DEFAULT_PACKAGE); } + private Boolean getReactiveValue(final Config config) { + return config + .getOptionalValue(getCodegenReactive(), Boolean.class) + .orElse(Boolean.FALSE); + } + private static JaxRsProjectSettings defaultProjectSettings() { JaxRsProjectSettings projectSettings = new JaxRsProjectSettings(); projectSettings.setJavaPackage(DEFAULT_PACKAGE); diff --git a/server/integration-tests/pom.xml b/server/integration-tests/pom.xml index 439753f8..f8185612 100755 --- a/server/integration-tests/pom.xml +++ b/server/integration-tests/pom.xml @@ -1,5 +1,6 @@ - + quarkus-openapi-generator-server-parent io.quarkiverse.openapi.generator @@ -8,98 +9,14 @@ 4.0.0 - quarkus-openapi-generator-server-integration-tests + pom + + quarkus-openapi-generator-server-integration-tests-parent Quarkus - Openapi Generator - Server - Integration Tests - - - io.quarkus - quarkus-undertow - - - io.quarkus - quarkus-resteasy-jackson - - - io.quarkiverse.openapi.generator - quarkus-openapi-generator-server - - - io.quarkus - quarkus-junit5 - test - - - io.quarkus - quarkus-test-common - test - - - org.junit.jupiter - junit-jupiter - test - - - io.rest-assured - rest-assured - test - - + + reactive + resteasy + - - - - - io.quarkus - quarkus-maven-plugin - ${quarkus.version} - - - maven-surefire-plugin - ${version.surefire.plugin} - - - org.jboss.logmanager.LogManager - ${maven.home} - ${settings.localRepository} - - - - - maven-failsafe-plugin - ${failsafe-plugin.version} - - - org.jboss.logmanager.LogManager - ${maven.home} - ${settings.localRepository} - - - - - maven-compiler-plugin - ${compiler-plugin.version} - - - -parameters - - - - - - - - io.quarkus - quarkus-maven-plugin - - - - build - generate-code - - - - - - \ No newline at end of file diff --git a/server/integration-tests/reactive/pom.xml b/server/integration-tests/reactive/pom.xml new file mode 100644 index 00000000..fe4da5e0 --- /dev/null +++ b/server/integration-tests/reactive/pom.xml @@ -0,0 +1,109 @@ + + + + quarkus-openapi-generator-server-integration-tests-parent + io.quarkiverse.openapi.generator + 3.0.0-SNAPSHOT + ../pom.xml + + 4.0.0 + + quarkus-openapi-generator-server-integration-tests-resteasy-reactive + Quarkus - Openapi Generator - Server - Integration Tests - Resteasy + + + + io.quarkus + quarkus-undertow + + + io.quarkus + quarkus-resteasy-reactive + + + io.quarkus + quarkus-resteasy-reactive-jackson + + + io.quarkiverse.openapi.generator + quarkus-openapi-generator-server + + + io.quarkus + quarkus-junit5 + test + + + io.quarkus + quarkus-test-common + test + + + org.junit.jupiter + junit-jupiter + test + + + io.rest-assured + rest-assured + test + + + + + + + + io.quarkus + quarkus-maven-plugin + ${quarkus.version} + + + maven-surefire-plugin + ${version.surefire.plugin} + + + org.jboss.logmanager.LogManager + ${maven.home} + ${settings.localRepository} + + + + + maven-failsafe-plugin + ${failsafe-plugin.version} + + + org.jboss.logmanager.LogManager + ${maven.home} + ${settings.localRepository} + + + + + maven-compiler-plugin + ${compiler-plugin.version} + + + -parameters + + + + + + + + io.quarkus + quarkus-maven-plugin + + + + build + generate-code + + + + + + + \ No newline at end of file diff --git a/server/integration-tests/reactive/src/main/java/petstore/PetStoreImpl.java b/server/integration-tests/reactive/src/main/java/petstore/PetStoreImpl.java new file mode 100755 index 00000000..e15ed003 --- /dev/null +++ b/server/integration-tests/reactive/src/main/java/petstore/PetStoreImpl.java @@ -0,0 +1,58 @@ +package petstore; + +import java.io.InputStream; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionStage; + +import io.petstore.PetResource; +import io.petstore.beans.ApiResponse; +import io.petstore.beans.Pet; + +public class PetStoreImpl implements PetResource { + + private static final Map PETS = new HashMap<>(); + + @Override + public CompletionStage updatePet(Pet data) { + return CompletableFuture.completedFuture(PETS.put(data.getId(), data)); + } + + @Override + public CompletionStage addPet(Pet data) { + return CompletableFuture.completedFuture(PETS.put(data.getId(), data)); + } + + @Override + public CompletionStage> findPetsByStatus(String status) { + return null; + } + + @Override + public CompletionStage> findPetsByTags(List tags) { + return null; + } + + @Override + public CompletionStage getPetById(long petId) { + return CompletableFuture.completedFuture(PETS.get(petId)); + } + + @Override + public CompletionStage updatePetWithForm(long petId, String name, String status) { + return CompletableFuture.completedFuture(null); + } + + @Override + public CompletionStage deletePet(String apiKey, long petId) { + PETS.remove(petId); + return CompletableFuture.completedFuture(null); + } + + @Override + public CompletionStage uploadFile(long petId, String additionalMetadata, InputStream data) { + return null; + } +} diff --git a/server/integration-tests/reactive/src/main/resources/application.properties b/server/integration-tests/reactive/src/main/resources/application.properties new file mode 100755 index 00000000..29a2f3da --- /dev/null +++ b/server/integration-tests/reactive/src/main/resources/application.properties @@ -0,0 +1,4 @@ +# Codegen properties +quarkus.openapi.generator.spec=petstore-openapi.json +quarkus.openapi.generator.base-package=io.petstore +quarkus.openapi.generator.reactive=true diff --git a/server/integration-tests/src/main/resources/openapi/petstore-openapi.json b/server/integration-tests/reactive/src/main/resources/openapi/petstore-openapi.json similarity index 100% rename from server/integration-tests/src/main/resources/openapi/petstore-openapi.json rename to server/integration-tests/reactive/src/main/resources/openapi/petstore-openapi.json diff --git a/server/integration-tests/reactive/src/test/java/it/PetStoreTest.java b/server/integration-tests/reactive/src/test/java/it/PetStoreTest.java new file mode 100755 index 00000000..1db7d81f --- /dev/null +++ b/server/integration-tests/reactive/src/test/java/it/PetStoreTest.java @@ -0,0 +1,47 @@ +package it; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.CoreMatchers.anything; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import io.petstore.beans.Pet; +import io.quarkus.test.junit.QuarkusTest; +import io.restassured.http.ContentType; + +@QuarkusTest +public class PetStoreTest { + + @Test + public void testapi() { + + Pet pet = new Pet(); + pet.setName("test"); + pet.setId(1234L); + pet.setStatus(Pet.Status.available); + + given() + .when() + .contentType(ContentType.JSON) + .body(pet) + .post("/pet") + .then() + .statusCode(204) + .body(anything()); + + final Pet returnedPet = given() + .when() + .accept(ContentType.JSON) + .get("/pet/1234") + .then() + .statusCode(200) + .extract() + .body() + .as(Pet.class); + + Assertions.assertEquals(pet.getId(), returnedPet.getId()); + Assertions.assertEquals(pet.getName(), returnedPet.getName()); + Assertions.assertEquals(pet.getStatus(), returnedPet.getStatus()); + } +} diff --git a/server/integration-tests/resteasy/pom.xml b/server/integration-tests/resteasy/pom.xml new file mode 100644 index 00000000..31356519 --- /dev/null +++ b/server/integration-tests/resteasy/pom.xml @@ -0,0 +1,109 @@ + + + + quarkus-openapi-generator-server-integration-tests-parent + io.quarkiverse.openapi.generator + 3.0.0-SNAPSHOT + ../pom.xml + + 4.0.0 + + quarkus-openapi-generator-server-integration-tests-resteasy + Quarkus - Openapi Generator - Server - Integration Tests - Resteasy + + + + io.quarkus + quarkus-undertow + + + io.quarkus + quarkus-rest + + + io.quarkus + quarkus-rest-jackson + + + io.quarkiverse.openapi.generator + quarkus-openapi-generator-server + + + io.quarkus + quarkus-junit5 + test + + + io.quarkus + quarkus-test-common + test + + + org.junit.jupiter + junit-jupiter + test + + + io.rest-assured + rest-assured + test + + + + + + + + io.quarkus + quarkus-maven-plugin + ${quarkus.version} + + + maven-surefire-plugin + ${version.surefire.plugin} + + + org.jboss.logmanager.LogManager + ${maven.home} + ${settings.localRepository} + + + + + maven-failsafe-plugin + ${failsafe-plugin.version} + + + org.jboss.logmanager.LogManager + ${maven.home} + ${settings.localRepository} + + + + + maven-compiler-plugin + ${compiler-plugin.version} + + + -parameters + + + + + + + + io.quarkus + quarkus-maven-plugin + + + + build + generate-code + + + + + + + \ No newline at end of file diff --git a/server/integration-tests/src/main/java/io/petstore/PetStoreImpl.java b/server/integration-tests/resteasy/src/main/java/io/petstore/PetStoreImpl.java similarity index 100% rename from server/integration-tests/src/main/java/io/petstore/PetStoreImpl.java rename to server/integration-tests/resteasy/src/main/java/io/petstore/PetStoreImpl.java diff --git a/server/integration-tests/resteasy/src/main/resources/application.properties b/server/integration-tests/resteasy/src/main/resources/application.properties new file mode 100755 index 00000000..5c2e7ae4 --- /dev/null +++ b/server/integration-tests/resteasy/src/main/resources/application.properties @@ -0,0 +1,4 @@ +# Codegen properties +quarkus.openapi.generator.spec=petstore-openapi.json +quarkus.openapi.generator.base-package=io.petstore +quarkus.openapi.generator.reactive=false diff --git a/server/integration-tests/resteasy/src/main/resources/openapi/petstore-openapi.json b/server/integration-tests/resteasy/src/main/resources/openapi/petstore-openapi.json new file mode 100755 index 00000000..12881192 --- /dev/null +++ b/server/integration-tests/resteasy/src/main/resources/openapi/petstore-openapi.json @@ -0,0 +1,1225 @@ +{ + "openapi": "3.0.2", + "info": { + "title": "Swagger Petstore - OpenAPI 3.0", + "description": "This is a sample Pet Store Server based on the OpenAPI 3.0 specification. You can find out more about\nSwagger at [http://swagger.io](http://swagger.io). In the third iteration of the pet store, we've switched to the design first approach!\nYou can now help us improve the API whether it's by making changes to the definition itself or to the code.\nThat way, with time, we can improve the API in general, and expose some of the new features in OAS3.\n\nSome useful links:\n- [The Pet Store repository](https://github.com/swagger-api/swagger-petstore)\n- [The source API definition for the Pet Store](https://github.com/swagger-api/swagger-petstore/blob/master/src/main/resources/openapi.yaml)", + "termsOfService": "http://swagger.io/terms/", + "contact": { + "email": "apiteam@swagger.io" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + }, + "version": "1.0.17" + }, + "externalDocs": { + "description": "Find out more about Swagger", + "url": "http://swagger.io" + }, + "servers": [ + { + "url": "/api/v3" + } + ], + "tags": [ + { + "name": "pet", + "description": "Everything about your Pets", + "externalDocs": { + "description": "Find out more", + "url": "http://swagger.io" + } + }, + { + "name": "store", + "description": "Access to Petstore orders", + "externalDocs": { + "description": "Find out more about our store", + "url": "http://swagger.io" + } + }, + { + "name": "user", + "description": "Operations about user" + } + ], + "paths": { + "/pet": { + "put": { + "tags": [ + "pet" + ], + "summary": "Update an existing pet", + "description": "Update an existing pet by Id", + "operationId": "updatePet", + "requestBody": { + "description": "Update an existent pet in the store", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + }, + "405": { + "description": "Validation exception" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + }, + "post": { + "tags": [ + "pet" + ], + "summary": "Add a new pet to the store", + "description": "Add a new pet to the store", + "operationId": "addPet", + "requestBody": { + "description": "Create a new pet in the store", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + } + }, + "405": { + "description": "Invalid input" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/findByStatus": { + "get": { + "tags": [ + "pet" + ], + "summary": "Finds Pets by status", + "description": "Multiple status values can be provided with comma separated strings", + "operationId": "findPetsByStatus", + "parameters": [ + { + "name": "status", + "in": "query", + "description": "Status values that need to be considered for filter", + "required": false, + "explode": true, + "schema": { + "type": "string", + "default": "available", + "enum": [ + "available", + "pending", + "sold" + ] + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + }, + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + } + } + }, + "400": { + "description": "Invalid status value" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/findByTags": { + "get": { + "tags": [ + "pet" + ], + "summary": "Finds Pets by tags", + "description": "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", + "operationId": "findPetsByTags", + "parameters": [ + { + "name": "tags", + "in": "query", + "description": "Tags to filter by", + "required": false, + "explode": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + }, + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + } + } + }, + "400": { + "description": "Invalid tag value" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/{petId}": { + "get": { + "tags": [ + "pet" + ], + "summary": "Find pet by ID", + "description": "Returns a single pet", + "operationId": "getPetById", + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet to return", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + } + }, + "security": [ + { + "api_key": [] + }, + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + }, + "post": { + "tags": [ + "pet" + ], + "summary": "Updates a pet in the store with form data", + "description": "", + "operationId": "updatePetWithForm", + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet that needs to be updated", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "name", + "in": "query", + "description": "Name of pet that needs to be updated", + "schema": { + "type": "string" + } + }, + { + "name": "status", + "in": "query", + "description": "Status of pet that needs to be updated", + "schema": { + "type": "string" + } + } + ], + "responses": { + "405": { + "description": "Invalid input" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + }, + "delete": { + "tags": [ + "pet" + ], + "summary": "Deletes a pet", + "description": "", + "operationId": "deletePet", + "parameters": [ + { + "name": "api_key", + "in": "header", + "description": "", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "petId", + "in": "path", + "description": "Pet id to delete", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "400": { + "description": "Invalid pet value" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/{petId}/uploadImage": { + "post": { + "tags": [ + "pet" + ], + "summary": "uploads an image", + "description": "", + "operationId": "uploadFile", + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet to update", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "additionalMetadata", + "in": "query", + "description": "Additional Metadata", + "required": false, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponse" + } + } + } + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/store/inventory": { + "get": { + "tags": [ + "store" + ], + "summary": "Returns pet inventories by status", + "description": "Returns a map of status codes to quantities", + "operationId": "getInventory", + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": { + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "security": [ + { + "api_key": [] + } + ] + } + }, + "/store/order": { + "post": { + "tags": [ + "store" + ], + "summary": "Place an order for a pet", + "description": "Place a new order in the store", + "operationId": "placeOrder", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Order" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + } + }, + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + } + }, + "405": { + "description": "Invalid input" + } + } + } + }, + "/store/order/{orderId}": { + "get": { + "tags": [ + "store" + ], + "summary": "Find purchase order by ID", + "description": "For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions.", + "operationId": "getOrderById", + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "ID of order that needs to be fetched", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Order" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Order not found" + } + } + }, + "delete": { + "tags": [ + "store" + ], + "summary": "Delete purchase order by ID", + "description": "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors", + "operationId": "deleteOrder", + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "ID of the order that needs to be deleted", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Order not found" + } + } + } + }, + "/user": { + "post": { + "tags": [ + "user" + ], + "summary": "Create user", + "description": "This can only be done by the logged in user.", + "operationId": "createUser", + "requestBody": { + "description": "Created user object", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "responses": { + "default": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + } + } + } + }, + "/user/createWithList": { + "post": { + "tags": [ + "user" + ], + "summary": "Creates list of users with given input array", + "description": "Creates list of users with given input array", + "operationId": "createUsersWithListInput", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "default": { + "description": "successful operation" + } + } + } + }, + "/user/login": { + "get": { + "tags": [ + "user" + ], + "summary": "Logs user into the system", + "description": "", + "operationId": "loginUser", + "parameters": [ + { + "name": "username", + "in": "query", + "description": "The user name for login", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "password", + "in": "query", + "description": "The password for login in clear text", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "X-Rate-Limit": { + "description": "calls per hour allowed by the user", + "schema": { + "type": "integer", + "format": "int32" + } + }, + "X-Expires-After": { + "description": "date in UTC when token expires", + "schema": { + "type": "string", + "format": "date-time" + } + } + }, + "content": { + "application/xml": { + "schema": { + "type": "string" + } + }, + "application/json": { + "schema": { + "type": "string" + } + } + } + }, + "400": { + "description": "Invalid username/password supplied" + } + } + } + }, + "/user/logout": { + "get": { + "tags": [ + "user" + ], + "summary": "Logs out current logged in user session", + "description": "", + "operationId": "logoutUser", + "parameters": [], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/{username}": { + "get": { + "tags": [ + "user" + ], + "summary": "Get user by user name", + "description": "", + "operationId": "getUserByName", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be fetched. Use user1 for testing. ", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } + } + }, + "put": { + "tags": [ + "user" + ], + "summary": "Update user", + "description": "This can only be done by the logged in user.", + "operationId": "updateUser", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "name that need to be deleted", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "Update an existent user in the store", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "responses": { + "default": { + "description": "successful operation" + } + } + }, + "delete": { + "tags": [ + "user" + ], + "summary": "Delete user", + "description": "This can only be done by the logged in user.", + "operationId": "deleteUser", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be deleted", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } + } + } + } + }, + "components": { + "schemas": { + "Order": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 10 + }, + "petId": { + "type": "integer", + "format": "int64", + "example": 198772 + }, + "quantity": { + "type": "integer", + "format": "int32", + "example": 7 + }, + "shipDate": { + "type": "string", + "format": "date-time" + }, + "status": { + "type": "string", + "description": "Order Status", + "example": "approved", + "enum": [ + "placed", + "approved", + "delivered" + ] + }, + "complete": { + "type": "boolean" + } + }, + "xml": { + "name": "order" + } + }, + "Customer": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 100000 + }, + "username": { + "type": "string", + "example": "fehguy" + }, + "address": { + "type": "array", + "xml": { + "name": "addresses", + "wrapped": true + }, + "items": { + "$ref": "#/components/schemas/Address" + } + } + }, + "xml": { + "name": "customer" + } + }, + "Address": { + "type": "object", + "properties": { + "street": { + "type": "string", + "example": "437 Lytton" + }, + "city": { + "type": "string", + "example": "Palo Alto" + }, + "state": { + "type": "string", + "example": "CA" + }, + "zip": { + "type": "string", + "example": "94301" + } + }, + "xml": { + "name": "address" + } + }, + "Category": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 1 + }, + "name": { + "type": "string", + "example": "Dogs" + } + }, + "xml": { + "name": "category" + } + }, + "User": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 10 + }, + "username": { + "type": "string", + "example": "theUser" + }, + "firstName": { + "type": "string", + "example": "John" + }, + "lastName": { + "type": "string", + "example": "James" + }, + "email": { + "type": "string", + "example": "john@email.com" + }, + "password": { + "type": "string", + "example": "12345" + }, + "phone": { + "type": "string", + "example": "12345" + }, + "userStatus": { + "type": "integer", + "description": "User Status", + "format": "int32", + "example": 1 + } + }, + "xml": { + "name": "user" + } + }, + "Tag": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + }, + "xml": { + "name": "tag" + } + }, + "Pet": { + "required": [ + "name", + "photoUrls" + ], + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 10 + }, + "name": { + "type": "string", + "example": "doggie" + }, + "category": { + "$ref": "#/components/schemas/Category" + }, + "photoUrls": { + "type": "array", + "xml": { + "wrapped": true + }, + "items": { + "type": "string", + "xml": { + "name": "photoUrl" + } + } + }, + "tags": { + "type": "array", + "xml": { + "wrapped": true + }, + "items": { + "$ref": "#/components/schemas/Tag" + } + }, + "status": { + "type": "string", + "description": "pet status in the store", + "enum": [ + "available", + "pending", + "sold" + ] + } + }, + "xml": { + "name": "pet" + } + }, + "ApiResponse": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "type": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "xml": { + "name": "##default" + } + } + }, + "requestBodies": { + "Pet": { + "description": "Pet object that needs to be added to the store", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + } + }, + "UserArray": { + "description": "List of user object", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + } + } + }, + "securitySchemes": { + "petstore_auth": { + "type": "oauth2", + "flows": { + "implicit": { + "authorizationUrl": "https://petstore3.swagger.io/oauth/authorize", + "scopes": { + "write:pets": "modify pets in your account", + "read:pets": "read your pets" + } + } + } + }, + "api_key": { + "type": "apiKey", + "name": "api_key", + "in": "header" + } + } + } +} \ No newline at end of file diff --git a/server/integration-tests/src/test/java/io/quarkiverse/openapi/server/generator/it/PetStoreTest.java b/server/integration-tests/resteasy/src/test/java/io/quarkiverse/openapi/server/generator/it/PetStoreTest.java similarity index 100% rename from server/integration-tests/src/test/java/io/quarkiverse/openapi/server/generator/it/PetStoreTest.java rename to server/integration-tests/resteasy/src/test/java/io/quarkiverse/openapi/server/generator/it/PetStoreTest.java diff --git a/server/integration-tests/src/main/resources/application.properties b/server/integration-tests/src/main/resources/application.properties deleted file mode 100755 index a8ada41a..00000000 --- a/server/integration-tests/src/main/resources/application.properties +++ /dev/null @@ -1,3 +0,0 @@ -# Codegen properties -quarkus.openapi.generator.spec=petstore-openapi.json -quarkus.openapi.generator.base-package=io.petstore \ No newline at end of file From c174b6bb33c2b03600d72d319214a79defe86026 Mon Sep 17 00:00:00 2001 From: Carles Arnal Date: Thu, 13 Jun 2024 11:08:39 +0200 Subject: [PATCH 2/7] Update server/integration-tests/reactive/pom.xml Co-authored-by: Helber Belmiro --- server/integration-tests/reactive/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/integration-tests/reactive/pom.xml b/server/integration-tests/reactive/pom.xml index fe4da5e0..687c4ef1 100644 --- a/server/integration-tests/reactive/pom.xml +++ b/server/integration-tests/reactive/pom.xml @@ -9,7 +9,7 @@ 4.0.0 quarkus-openapi-generator-server-integration-tests-resteasy-reactive - Quarkus - Openapi Generator - Server - Integration Tests - Resteasy + Quarkus - Openapi Generator - Server - Integration Tests - Quarkus REST (formerly RESTEasy Reactive) From eed0a5ce904382f36b64b00a2cbb4a0c2a18bea9 Mon Sep 17 00:00:00 2001 From: Carles Arnal Date: Thu, 13 Jun 2024 11:08:46 +0200 Subject: [PATCH 3/7] Update server/integration-tests/resteasy/pom.xml Co-authored-by: Helber Belmiro --- server/integration-tests/resteasy/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/integration-tests/resteasy/pom.xml b/server/integration-tests/resteasy/pom.xml index 31356519..ff1dec32 100644 --- a/server/integration-tests/resteasy/pom.xml +++ b/server/integration-tests/resteasy/pom.xml @@ -22,7 +22,7 @@ io.quarkus - quarkus-rest-jackson + quarkus-resteasy-jackson io.quarkiverse.openapi.generator From 804f045814f26e20da26f585b65495ab62c14376 Mon Sep 17 00:00:00 2001 From: Carles Arnal Date: Thu, 13 Jun 2024 11:08:55 +0200 Subject: [PATCH 4/7] Update server/integration-tests/resteasy/pom.xml Co-authored-by: Helber Belmiro --- server/integration-tests/resteasy/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/integration-tests/resteasy/pom.xml b/server/integration-tests/resteasy/pom.xml index ff1dec32..f89a2d39 100644 --- a/server/integration-tests/resteasy/pom.xml +++ b/server/integration-tests/resteasy/pom.xml @@ -18,7 +18,7 @@ io.quarkus - quarkus-rest + quarkus-resteasy io.quarkus From fc9afe4a5c0bbef252341d74ed3b5dbf5f89356a Mon Sep 17 00:00:00 2001 From: Carles Arnal Date: Thu, 13 Jun 2024 11:09:01 +0200 Subject: [PATCH 5/7] Update server/integration-tests/reactive/pom.xml Co-authored-by: Helber Belmiro --- server/integration-tests/reactive/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/integration-tests/reactive/pom.xml b/server/integration-tests/reactive/pom.xml index 687c4ef1..ccc4010e 100644 --- a/server/integration-tests/reactive/pom.xml +++ b/server/integration-tests/reactive/pom.xml @@ -22,7 +22,7 @@ io.quarkus - quarkus-resteasy-reactive-jackson + quarkus-rest-jackson io.quarkiverse.openapi.generator From b56d15ec643bb51b749ff8c715d5ca8706312957 Mon Sep 17 00:00:00 2001 From: Carles Arnal Date: Thu, 13 Jun 2024 11:09:11 +0200 Subject: [PATCH 6/7] Update server/integration-tests/reactive/pom.xml Co-authored-by: Helber Belmiro --- server/integration-tests/reactive/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/integration-tests/reactive/pom.xml b/server/integration-tests/reactive/pom.xml index ccc4010e..ed7b074b 100644 --- a/server/integration-tests/reactive/pom.xml +++ b/server/integration-tests/reactive/pom.xml @@ -8,7 +8,7 @@ 4.0.0 - quarkus-openapi-generator-server-integration-tests-resteasy-reactive + quarkus-openapi-generator-server-integration-tests-quarkus-rest Quarkus - Openapi Generator - Server - Integration Tests - Quarkus REST (formerly RESTEasy Reactive) From d14b85fbc285671194ff0ea88f0d46e395581b67 Mon Sep 17 00:00:00 2001 From: Carles Arnal Date: Thu, 13 Jun 2024 11:09:17 +0200 Subject: [PATCH 7/7] Update server/integration-tests/reactive/pom.xml Co-authored-by: Helber Belmiro --- server/integration-tests/reactive/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/integration-tests/reactive/pom.xml b/server/integration-tests/reactive/pom.xml index ed7b074b..efe96d11 100644 --- a/server/integration-tests/reactive/pom.xml +++ b/server/integration-tests/reactive/pom.xml @@ -18,7 +18,7 @@ io.quarkus - quarkus-resteasy-reactive + quarkus-rest io.quarkus