diff --git a/boat-scaffold/src/main/java/com/backbase/oss/codegen/BoatStaticDocsGenerator.java b/boat-scaffold/src/main/java/com/backbase/oss/codegen/BoatStaticDocsGenerator.java index e1ee165e2..7584cd0a6 100644 --- a/boat-scaffold/src/main/java/com/backbase/oss/codegen/BoatStaticDocsGenerator.java +++ b/boat-scaffold/src/main/java/com/backbase/oss/codegen/BoatStaticDocsGenerator.java @@ -20,6 +20,7 @@ import org.openapitools.codegen.CodegenModel; import org.openapitools.codegen.CodegenParameter; import org.openapitools.codegen.CodegenResponse; +import org.openapitools.codegen.utils.ModelUtils; import java.io.IOException; import java.nio.charset.Charset; @@ -65,9 +66,16 @@ public void preprocessOpenAPI(OpenAPI openAPI) { } if (openAPI.getComponents().getExamples() != null) { - Set imports = new HashSet<>(); additionalProperties.put("examples", openAPI.getComponents().getExamples().entrySet().stream() - .map(exampleEntry -> mapComponentExample(imports, exampleEntry)) + .map(this::mapComponentExample) + .collect(Collectors.toList())); + } + + // We need freeForm objects as models as well, since they are being referenced with $ref + if (openAPI.getComponents().getSchemas() != null) { + additionalProperties.put("freeFormModels", openAPI.getComponents().getSchemas().entrySet().stream() + .filter(freeFormModel -> ModelUtils.isFreeFormObject(freeFormModel.getValue())) + .map(this::mapFreeFormObject) .collect(Collectors.toList())); } @@ -90,12 +98,17 @@ private CodegenParameter mapComponentRequestBody(Set imports, java.util. return fromRequestBody(requestBody, imports, name); } - private BoatExample mapComponentExample(Set imports, Map.Entry namedExample) { + private BoatExample mapComponentExample( Map.Entry namedExample) { String key = namedExample.getKey(); Example example = namedExample.getValue(); return new BoatExample(key,"", example , false); } + private Object mapFreeFormObject(Map.Entry freeFormObject) {//NOSONAR + String name = freeFormObject.getKey(); + return fromModel(name, freeFormObject.getValue()); + } + private CodegenParameter mapComponentParameter(Set imports, java.util.Map.Entry nameParameter) { Parameter parameter = nameParameter.getValue(); return fromParameter(parameter, imports); diff --git a/boat-scaffold/src/main/templates/boat-marina/api.js.handlebars b/boat-scaffold/src/main/templates/boat-marina/api.js.handlebars index 1b121a32a..32c92cd7e 100644 --- a/boat-scaffold/src/main/templates/boat-marina/api.js.handlebars +++ b/boat-scaffold/src/main/templates/boat-marina/api.js.handlebars @@ -47,12 +47,13 @@ const data = { data["parameters"]["{{paramName}}"] = {{{jsonSchema}}}; {{/each}} +{{#each freeFormModels}} + data.models["{{name}}"] = {{{json .}}}; +{{/each}} {{#each swagger.vendorExtensions.x-shared-errors}} let err = {{{json .}}}; data["errors"][err.errorID] = err; {{/each}} - - module.exports = { data }; \ No newline at end of file diff --git a/boat-scaffold/src/test/java/com/backbase/oss/codegen/marina/BoatMarinaTest.java b/boat-scaffold/src/test/java/com/backbase/oss/codegen/marina/BoatMarinaTest.java index 0da0acccf..682f51b63 100644 --- a/boat-scaffold/src/test/java/com/backbase/oss/codegen/marina/BoatMarinaTest.java +++ b/boat-scaffold/src/test/java/com/backbase/oss/codegen/marina/BoatMarinaTest.java @@ -2,7 +2,6 @@ import com.backbase.oss.boat.loader.OpenAPILoader; import com.backbase.oss.boat.loader.OpenAPILoaderException; -import com.backbase.oss.codegen.doc.BoatDocsGenerator; import io.swagger.v3.oas.models.OpenAPI; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; @@ -42,6 +41,11 @@ void testGenerateDocs() throws IOException { File index = new File("target/marina-docs/api.js"); String generated = String.join(" ", Files.readAllLines(Paths.get(index.getPath()))); assertTrue(generated.startsWith("/**")); + assertTrue(generated.contains("Simple API overview")); + assertTrue(generated.contains("appDescription: \"No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)\",")); + assertTrue(generated.contains("data.examples[\"BadRequestError\"]")); + assertTrue(generated.contains("data.models[\"ParameterMap\"]")); + } @@ -53,7 +57,7 @@ protected File getFile(String name) { } - private static void generateDocs(File spec) { + private static void generateDocs(File spec) throws IOException { log.info("Generate docs for: {}", spec); OpenAPI openAPI = null; try { diff --git a/boat-scaffold/src/test/resources/openapi-with-examples/openapi-with-json.yaml b/boat-scaffold/src/test/resources/openapi-with-examples/openapi-with-json.yaml index de066b028..0b1572413 100644 --- a/boat-scaffold/src/test/resources/openapi-with-examples/openapi-with-json.yaml +++ b/boat-scaffold/src/test/resources/openapi-with-examples/openapi-with-json.yaml @@ -2,7 +2,38 @@ openapi: "3.0.0" info: title: Simple API overview version: 2.0.0 +components: + schemas: + ParameterMap: + type: object + additionalProperties: + type: object + example: + enable_payments: true + examples: + BadRequestError: + summary: BadRequestError + value: + message: Bad Request + errors: + - message: "Value Exceeded. Must be between {min} and {max}." + key: common.api.shoesize + context: + max: "50" + min: "1" paths: + /foo: + description: Some random description + get: + operationId: foo + summary: Gets a project's parameters. + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ParameterMap' /: get: operationId: listVersionsv2 @@ -29,6 +60,8 @@ paths: links: - href: http://127.0.0.1:8774/v3/ rel: self + bar: + $ref: '#/components/examples/BadRequestError' '300': description: |-