From 74d836ef1cb860681c9c78900aa16a4ecbb03b2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20E=2E=20Garcia=20Maci=C3=B1eiras?= <68995937+jemacineiras@users.noreply.github.com> Date: Sat, 2 Nov 2024 10:12:39 +0100 Subject: [PATCH] 328 support for multipart (#351) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 328 added removal of @RequestBody anotation when requestBody is multipart/form-data and created MultiPartFile type --------- Co-authored-by: Óscar Ares Bascón --- multiapi-engine/pom.xml | 2 +- .../common/model/SchemaFieldObjectType.java | 6 ++- .../plugin/common/model/TypeConstants.java | 7 ++- .../plugin/common/tools/ApiTool.java | 15 ++++++ .../plugin/common/tools/MapperUtil.java | 4 +- .../plugin/common/tools/ModelBuilder.java | 41 ++++++++++------- .../plugin/openapi/model/RequestObject.java | 2 + .../plugin/openapi/utils/MapperPathUtil.java | 2 + .../resources/templates/openapi/template.ftlh | 2 +- .../openapi/OpenApiGeneratorFixtures.java | 28 +++++++++++ .../plugin/openapi/OpenApiGeneratorTest.java | 16 ++++--- .../api-test.yml | 29 ++++++++++++ .../assets/TestApi.java | 46 +++++++++++++++++++ .../assets/model/DocumentDTO.java | 5 +- scs-multiapi-gradle-plugin/build.gradle | 6 +-- scs-multiapi-maven-plugin/pom.xml | 4 +- 16 files changed, 178 insertions(+), 37 deletions(-) create mode 100644 multiapi-engine/src/test/resources/openapigenerator/testFormDataMultipartGeneration/api-test.yml create mode 100644 multiapi-engine/src/test/resources/openapigenerator/testFormDataMultipartGeneration/assets/TestApi.java diff --git a/multiapi-engine/pom.xml b/multiapi-engine/pom.xml index 6b10a53b..9e2e85ea 100644 --- a/multiapi-engine/pom.xml +++ b/multiapi-engine/pom.xml @@ -4,7 +4,7 @@ com.sngular multiapi-engine - 6.0.1 + 6.0.2 jar diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/SchemaFieldObjectType.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/SchemaFieldObjectType.java index 42144d46..4bf57f22 100644 --- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/SchemaFieldObjectType.java +++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/SchemaFieldObjectType.java @@ -34,7 +34,8 @@ public class SchemaFieldObjectType { new SimpleImmutableEntry<>(TypeConstants.ZONEDDATE, ZONED_DATE_TIME), new SimpleImmutableEntry<>(TypeConstants.ZONEDDATETIME, ZONED_DATE_TIME), new SimpleImmutableEntry<>(TypeConstants.OFFSETDATE, OFFSET_DATE_TIME), - new SimpleImmutableEntry<>(TypeConstants.OFFSETDATETIME, OFFSET_DATE_TIME) + new SimpleImmutableEntry<>(TypeConstants.OFFSETDATETIME, OFFSET_DATE_TIME), + new SimpleImmutableEntry<>(TypeConstants.MULTIPART_FILE, "MultipartFile") ); private static final Map IMPL_TYPE_MAPPINGS = Map.ofEntries( @@ -53,7 +54,8 @@ public class SchemaFieldObjectType { new SimpleImmutableEntry<>(TypeConstants.ZONEDDATE, ZONED_DATE_TIME), new SimpleImmutableEntry<>(TypeConstants.ZONEDDATETIME, ZONED_DATE_TIME), new SimpleImmutableEntry<>(TypeConstants.OFFSETDATE, OFFSET_DATE_TIME), - new SimpleImmutableEntry<>(TypeConstants.OFFSETDATETIME, OFFSET_DATE_TIME) + new SimpleImmutableEntry<>(TypeConstants.OFFSETDATETIME, OFFSET_DATE_TIME), + new SimpleImmutableEntry<>(TypeConstants.MULTIPART_FILE, "MultipartFile") ); private SchemaFieldObjectType innerType; diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/TypeConstants.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/TypeConstants.java index da239494..e713f6d3 100644 --- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/TypeConstants.java +++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/TypeConstants.java @@ -34,6 +34,8 @@ public final class TypeConstants { public static final String ENUM = "enum"; + public static final String BINARY = "binary"; + public static final String LOCALDATE = "localdate"; public static final String LOCALDATETIME = "localdatetime"; @@ -50,6 +52,8 @@ public final class TypeConstants { public static final String INT_64 = "int64"; + public static final String MULTIPART_FILE = "multipartfile"; + public static final Set BASIC_OBJECT_TYPE = Set.of(NUMBER, STRING, BOOLEAN, INTEGER, ARRAY); public static final Set NO_IMPORT_TYPE = Set.of(STRING, INTEGER, OBJECT); @@ -86,7 +90,8 @@ public final class TypeConstants { ZONEDDATE, ZONEDDATETIME, OFFSETDATE, - OFFSETDATETIME + OFFSETDATETIME, + MULTIPART_FILE ); private TypeConstants() { diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/ApiTool.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/ApiTool.java index 8f15e272..413f2b14 100644 --- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/ApiTool.java +++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/ApiTool.java @@ -286,6 +286,21 @@ public static boolean isDateTime(final JsonNode schema) { return isDateTime; } + public static boolean isBinary(final JsonNode schema) { + final boolean isMultipartFile; + if (hasType(schema) && TypeConstants.STRING.equalsIgnoreCase(getType(schema))) { + if (hasNode(schema, FORMAT)) { + isMultipartFile = "binary".equalsIgnoreCase(getNode(schema, FORMAT).textValue()); + } else { + isMultipartFile = false; + } + } else { + isMultipartFile = false; + } + return isMultipartFile; + } + + public static List findContentSchemas(final JsonNode schema) { return hasNode(schema, "content") ? schema.findValues("schema") : Collections.emptyList(); } diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/MapperUtil.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/MapperUtil.java index d2d80ed1..5c7877d8 100644 --- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/MapperUtil.java +++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/MapperUtil.java @@ -1,7 +1,7 @@ /* * This Source Code Form is subject to the terms of the Mozilla Public - * * License, v. 2.0. If a copy of the MPL was not distributed with this - * * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ package com.sngular.api.generator.plugin.common.tools; diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/ModelBuilder.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/ModelBuilder.java index 86bb5d5f..e4369cdb 100644 --- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/ModelBuilder.java +++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/ModelBuilder.java @@ -1,26 +1,22 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * * License, v. 2.0. If a copy of the MPL was not distributed with this + * * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + package com.sngular.api.generator.plugin.common.tools; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.function.Consumer; import com.fasterxml.jackson.databind.JsonNode; -import com.sngular.api.generator.plugin.common.model.CommonSpecFile; -import com.sngular.api.generator.plugin.common.model.SchemaFieldObject; -import com.sngular.api.generator.plugin.common.model.SchemaFieldObjectType; -import com.sngular.api.generator.plugin.common.model.SchemaObject; -import com.sngular.api.generator.plugin.common.model.TypeConstants; +import com.sngular.api.generator.plugin.common.model.*; import com.sngular.api.generator.plugin.openapi.exception.BadDefinedEnumException; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.text.WordUtils; +import java.nio.file.Path; +import java.util.*; +import java.util.function.Consumer; + public final class ModelBuilder { private static final String ADDITIONAL_PROPERTY_NAME = "AdditionalProperty"; @@ -130,6 +126,10 @@ private static void getTypeImports( if (type.containsType(TypeConstants.OFFSETDATETIME)) { listHashMap.computeIfAbsent(TypeConstants.OFFSETDATETIME, key -> List.of("java.time.OffsetDateTime")); } + + if (type.containsType(TypeConstants.MULTIPART_FILE)) { + listHashMap.computeIfAbsent(TypeConstants.MULTIPART_FILE, key -> List.of("org.springframework.web.multipart.MultipartFile")); + } } private static Set getFields(final String buildingSchema, @@ -321,7 +321,16 @@ private static Object getConst(final JsonNode fieldBody) { } private static SchemaFieldObject processStringProperty(final String propertyName, final JsonNode schema, final CommonSpecFile specFile) { - final String resultingType = ApiTool.isDateTime(schema) ? MapperUtil.getDateType(schema, specFile) : TypeConstants.STRING; + String resultingType; + if (ApiTool.isDateTime(schema)) { + resultingType = MapperUtil.getDateType(schema, specFile); + } + else if (ApiTool.isBinary(schema)) { + resultingType = TypeConstants.MULTIPART_FILE; + } + else { + resultingType = TypeConstants.STRING; + } final SchemaFieldObject field = SchemaFieldObject .builder() diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/RequestObject.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/RequestObject.java index 2221b1f7..f635a035 100644 --- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/RequestObject.java +++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/RequestObject.java @@ -23,6 +23,8 @@ public class RequestObject { private List contentObjects; + private Boolean isFormData; + public static final class RequestObjectBuilder { private final List contentObjects = new ArrayList<>(); diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/utils/MapperPathUtil.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/utils/MapperPathUtil.java index 13a6cdee..5ec8cb62 100644 --- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/utils/MapperPathUtil.java +++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/utils/MapperPathUtil.java @@ -216,6 +216,7 @@ private static List mapRequestObject( if (!ApiTool.hasRef(requestBody)) { requestObjects.add(RequestObject.builder() .required(ApiTool.hasNode(requestBody, REQUIRED)) + .isFormData(ApiTool.getNode(requestBody, CONTENT).has("multipart/form-data")) .contentObjects(mapContentObject(specFile, ApiTool.getNode(requestBody, CONTENT), "InlineObject" + operationIdWithCap, globalObject, baseDir)) .build()); @@ -223,6 +224,7 @@ private static List mapRequestObject( final var requestBodyNode = globalObject.getRequestBodyNode(MapperUtil.getRefSchemaKey(requestBody)).orElseThrow(); requestObjects.add(RequestObject.builder() .required(ApiTool.hasNode(requestBody, REQUIRED)) + .isFormData(ApiTool.getNode(requestBodyNode, CONTENT).has("multipart/form-data")) .contentObjects(mapContentObject(specFile, ApiTool.getNode(requestBodyNode, CONTENT), operationIdWithCap, globalObject, baseDir)) .build()); diff --git a/multiapi-engine/src/main/resources/templates/openapi/template.ftlh b/multiapi-engine/src/main/resources/templates/openapi/template.ftlh index 39df7b10..7c7296c8 100644 --- a/multiapi-engine/src/main/resources/templates/openapi/template.ftlh +++ b/multiapi-engine/src/main/resources/templates/openapi/template.ftlh @@ -88,7 +88,7 @@ public interface ${className?cap_first}Api { <${operation.responseObjects[0].contentObjects[0].dataType}<#else>> ${operation.operationId}(<@compress single_line=true> <#if operation.parameterObjects?has_content><#list operation.parameterObjects as parameter> @Parameter(name = "${parameter.name}", <#if parameter.description?has_content>description = "${parameter.description}", required = ${parameter.required?c}, schema = @Schema(description = "")) <#if parameter.in == "path"> @PathVariable("${parameter.name}") <#elseif parameter.in == "query"> @RequestParam(required = ${parameter.required?c}) ${parameter.dataType} ${parameter.name} <#if parameter?has_next || operation.requestObjects?has_content>, <#if path.parameterObjects?has_content><#list path.parameterObjects as parameter> @Parameter(name = "${parameter.name}", <#if parameter.description?has_content>description = "${parameter.description}", required = ${parameter.required?c}, schema = @Schema(description = "")) <#if parameter.in == "path"> @PathVariable("${parameter.name}") <#elseif parameter.in == "query"> @RequestParam(required = ${parameter.required?c}) ${parameter.dataType} ${parameter.name} <#if parameter?has_next || operation.requestObjects?has_content>, - <#if operation.requestObjects?has_content><#list operation.requestObjects as request> @Parameter(name = "${request.contentObjects[0].dataType?api.getVariableNameString()}", description = "${request.description! ""}", required = ${request.required?c}, schema = @Schema(description = "${request.contentObjects[0].description! ""}")) @Valid @RequestBody + <#if operation.requestObjects?has_content><#list operation.requestObjects as request> @Parameter(name = "${request.contentObjects[0].dataType?api.getVariableNameString()}", description = "${request.description! ""}", required = ${request.required?c}, schema = @Schema(description = "${request.contentObjects[0].description! ""}")) @Valid <#if request.isFormData == false>@RequestBody ${request.contentObjects[0].dataType} ${request.contentObjects[0].dataType?api.getVariableNameString()} <#if request?has_next>, ) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } diff --git a/multiapi-engine/src/test/java/com/sngular/api/generator/plugin/openapi/OpenApiGeneratorFixtures.java b/multiapi-engine/src/test/java/com/sngular/api/generator/plugin/openapi/OpenApiGeneratorFixtures.java index 91a3c273..ec85ded4 100644 --- a/multiapi-engine/src/test/java/com/sngular/api/generator/plugin/openapi/OpenApiGeneratorFixtures.java +++ b/multiapi-engine/src/test/java/com/sngular/api/generator/plugin/openapi/OpenApiGeneratorFixtures.java @@ -505,6 +505,14 @@ public final class OpenApiGeneratorFixtures { .build() ); + static final List TEST_FORM_DATA_MULTIPART_GENERATION = List.of( + SpecFile + .builder() + .filePath("openapigenerator/testFormDataMultipartGeneration/api-test.yml") + .apiPackage("com.sngular.multifileplugin.testformdatamultipartgeneration") + .useLombokModelAnnotation(true) + .build() + ); static Function validateOneOfInResponse() { @@ -1237,6 +1245,26 @@ static Function validateSimpleBuild() { return path -> commonTest(path, expectedTestApiFile, expectedTestApiModelFiles, DEFAULT_TARGET_API, DEFAULT_MODEL_API, Collections.emptyList(), null); } + + static Function validateDataMultipartGeneration() { + + final String DEFAULT_TARGET_API = "generated/com/sngular/multifileplugin/testformdatamultipartgeneration"; + + final String DEFAULT_MODEL_API = "generated/com/sngular/multifileplugin/testformdatamultipartgeneration/model"; + + final String COMMON_PATH = "openapigenerator/testFormDataMultipartGeneration/"; + + final String ASSETS_PATH = COMMON_PATH + "assets/"; + + final List expectedTestApiFile = List.of( + ASSETS_PATH + "TestApi.java" + ); + + final List expectedTestApiModelFiles = Collections.emptyList(); + + return path -> commonTest(path, expectedTestApiFile, expectedTestApiModelFiles, DEFAULT_TARGET_API, DEFAULT_MODEL_API, Collections.emptyList(), null); + } + static Function validateValidationAnnotations(int springBootVersion) { final String DEFAULT_TARGET_API = "generated/com/sngular/multifileplugin/testapi"; diff --git a/multiapi-engine/src/test/java/com/sngular/api/generator/plugin/openapi/OpenApiGeneratorTest.java b/multiapi-engine/src/test/java/com/sngular/api/generator/plugin/openapi/OpenApiGeneratorTest.java index f05e91df..5bfc420e 100644 --- a/multiapi-engine/src/test/java/com/sngular/api/generator/plugin/openapi/OpenApiGeneratorTest.java +++ b/multiapi-engine/src/test/java/com/sngular/api/generator/plugin/openapi/OpenApiGeneratorTest.java @@ -6,12 +6,6 @@ package com.sngular.api.generator.plugin.openapi; -import java.io.File; -import java.nio.file.Path; -import java.util.List; -import java.util.function.Function; -import java.util.stream.Stream; - import com.sngular.api.generator.plugin.exception.InvalidAPIException; import com.sngular.api.generator.plugin.openapi.parameter.SpecFile; import lombok.extern.slf4j.Slf4j; @@ -24,6 +18,12 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import java.io.File; +import java.nio.file.Path; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Stream; + @Slf4j class OpenApiGeneratorTest { @@ -124,7 +124,9 @@ static Stream fileSpecToProcess() { Arguments.of("testRestrictionSchema", OpenApiGeneratorFixtures.TEST_RESTRICTION_SCHEMA, OpenApiGeneratorFixtures.validateRestrictionsSchema()), Arguments.of("testSimpleBuild", OpenApiGeneratorFixtures.TEST_SIMPLE_BUILD, - OpenApiGeneratorFixtures.validateSimpleBuild()) + OpenApiGeneratorFixtures.validateSimpleBuild()), + Arguments.of("testFormDataMultipartGeneration", OpenApiGeneratorFixtures.TEST_FORM_DATA_MULTIPART_GENERATION, + OpenApiGeneratorFixtures.validateDataMultipartGeneration()) ); } diff --git a/multiapi-engine/src/test/resources/openapigenerator/testFormDataMultipartGeneration/api-test.yml b/multiapi-engine/src/test/resources/openapigenerator/testFormDataMultipartGeneration/api-test.yml new file mode 100644 index 00000000..7ab7b27f --- /dev/null +++ b/multiapi-engine/src/test/resources/openapigenerator/testFormDataMultipartGeneration/api-test.yml @@ -0,0 +1,29 @@ +openapi: 3.0.2 +info: + title: Testing example file + version: 1.0.0 +servers: +- url: http://localhost/v1 +paths: + /test: + get: + tags: + - test + operationId: testMultipart + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + someString: + type: string + someFile: + type: string + format: binary + + responses: + '200': + description: + OK diff --git a/multiapi-engine/src/test/resources/openapigenerator/testFormDataMultipartGeneration/assets/TestApi.java b/multiapi-engine/src/test/resources/openapigenerator/testFormDataMultipartGeneration/assets/TestApi.java new file mode 100644 index 00000000..f55eba8d --- /dev/null +++ b/multiapi-engine/src/test/resources/openapigenerator/testFormDataMultipartGeneration/assets/TestApi.java @@ -0,0 +1,46 @@ +package com.sngular.multifileplugin.testformdatamultipartgeneration; + +import java.util.Optional; +import java.util.List; +import java.util.Map; +import javax.validation.Valid; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import org.springframework.http.MediaType; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.context.request.NativeWebRequest; + +import com.sngular.multifileplugin.testformdatamultipartgeneration.InlineObjectTestMultipart; + +public interface TestApi { + + /** + * GET /test + * @param inlineObjectTestMultipart (required) + * @return OK; (status code 200) + */ + + @Operation( + operationId = "testMultipart", + tags = {"test"}, + responses = { + @ApiResponse(responseCode = "200", description = "OK") + } + ) + @RequestMapping( + method = RequestMethod.GET, + value = "/test", + produces = {"application/json"} + ) + + default ResponseEntity testMultipart(@Parameter(name = "inlineObjectTestMultipart", description = "", required = true, schema = @Schema(description = "")) @Valid InlineObjectTestMultipart inlineObjectTestMultipart) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } + +} diff --git a/multiapi-engine/src/test/resources/openapigenerator/testSimpleBuild/assets/model/DocumentDTO.java b/multiapi-engine/src/test/resources/openapigenerator/testSimpleBuild/assets/model/DocumentDTO.java index 60a3b0d8..47928e6c 100644 --- a/multiapi-engine/src/test/resources/openapigenerator/testSimpleBuild/assets/model/DocumentDTO.java +++ b/multiapi-engine/src/test/resources/openapigenerator/testSimpleBuild/assets/model/DocumentDTO.java @@ -1,6 +1,7 @@ package com.sngular.multifileplugin.testsimplebuild.model; import com.fasterxml.jackson.annotation.JsonProperty; +import org.springframework.web.multipart.MultipartFile; import lombok.Builder; import lombok.Value; import lombok.extern.jackson.Jacksonized; @@ -12,12 +13,12 @@ public class DocumentDTO { private String description; @JsonProperty(value ="document") - private String document; + private MultipartFile document; @Builder @Jacksonized - private DocumentDTO(String description, String document) { + private DocumentDTO(String description, MultipartFile document) { this.description = description; this.document = document; diff --git a/scs-multiapi-gradle-plugin/build.gradle b/scs-multiapi-gradle-plugin/build.gradle index 0bd62836..56d55021 100644 --- a/scs-multiapi-gradle-plugin/build.gradle +++ b/scs-multiapi-gradle-plugin/build.gradle @@ -20,7 +20,7 @@ repositories { } group = 'com.sngular' -version = '6.0.1' +version = '6.0.2' def SCSMultiApiPluginGroupId = group def SCSMultiApiPluginVersion = version @@ -30,7 +30,7 @@ dependencies { shadow localGroovy() shadow gradleApi() - implementation 'com.sngular:multiapi-engine:6.0.1' + implementation 'com.sngular:multiapi-engine:6.0.2' testImplementation 'org.assertj:assertj-core:3.24.2' testImplementation 'com.puppycrawl.tools:checkstyle:10.12.3' } @@ -98,7 +98,7 @@ testing { integrationTest(JvmTestSuite) { dependencies { - implementation 'com.sngular:scs-multiapi-gradle-plugin:6.0.1' + implementation 'com.sngular:scs-multiapi-gradle-plugin:6.0.2' implementation 'org.assertj:assertj-core:3.24.2' } diff --git a/scs-multiapi-maven-plugin/pom.xml b/scs-multiapi-maven-plugin/pom.xml index 68af61da..af9ebc37 100644 --- a/scs-multiapi-maven-plugin/pom.xml +++ b/scs-multiapi-maven-plugin/pom.xml @@ -4,7 +4,7 @@ com.sngular scs-multiapi-maven-plugin - 6.0.1 + 6.0.2 maven-plugin AsyncApi - OpenApi Code Generator Maven Plugin @@ -271,7 +271,7 @@ com.sngular multiapi-engine - 6.0.1 + 6.0.2 org.apache.maven