From 3f7f2b58e2ccfb9e58a1f8ab76606b1154c20e60 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 21 Mar 2023 17:00:47 -0500 Subject: [PATCH] Checkpoint - writing somewhat valid versions of all single-record actions --- .../actions/GenerateOpenApiSpecAction.java | 312 ++++++++++-------- .../qqq/api/model/openapi/RequestBody.java | 14 +- .../qqq/api/model/openapi/Schema.java | 32 ++ .../java/com/kingsrook/qqq/api/TestUtils.java | 2 +- .../GenerateOpenApiSpecActionTest.java | 4 +- 5 files changed, 213 insertions(+), 151 deletions(-) diff --git a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/GenerateOpenApiSpecAction.java b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/GenerateOpenApiSpecAction.java index a3ec4b1a..30401fd5 100644 --- a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/GenerateOpenApiSpecAction.java +++ b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/GenerateOpenApiSpecAction.java @@ -42,6 +42,7 @@ import com.kingsrook.qqq.api.model.openapi.OAuth2Flow; import com.kingsrook.qqq.api.model.openapi.OpenAPI; import com.kingsrook.qqq.api.model.openapi.Parameter; import com.kingsrook.qqq.api.model.openapi.Path; +import com.kingsrook.qqq.api.model.openapi.RequestBody; import com.kingsrook.qqq.api.model.openapi.Response; import com.kingsrook.qqq.api.model.openapi.Schema; import com.kingsrook.qqq.api.model.openapi.SecurityScheme; @@ -139,11 +140,12 @@ public class GenerateOpenApiSpecAction extends AbstractQActionFunction tableApiFields = new GetTableApiFieldsAction().execute(new GetTableApiFieldsInput().withTableName(tableName).withVersion(version)).getFields(); @@ -153,6 +155,28 @@ public class GenerateOpenApiSpecAction extends AbstractQActionFunction "string"; + case STRING, DATE, TIME, DATE_TIME, TEXT, HTML, PASSWORD, BLOB -> "string"; case INTEGER -> "integer"; - case DECIMAL -> null; - case BOOLEAN -> null; - case DATE -> null; - case TIME -> null; - case DATE_TIME -> null; - case TEXT -> null; - case HTML -> null; - case PASSWORD -> null; - case BLOB -> null; + case DECIMAL -> "number"; + case BOOLEAN -> "boolean"; + }; + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + private String getFieldFormat(QFieldMetaData field) + { + return (getFieldFormat(field.getType())); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + @SuppressWarnings("checkstyle:indentation") + private String getFieldFormat(QFieldType type) + { + return switch(type) + { + case DATE -> "date"; + case TIME -> "time"; // non-standard format... + case DATE_TIME -> "date-time"; + case PASSWORD -> "password"; + case BLOB -> "byte"; // base-64-encoded, per https://swagger.io/docs/specification/data-models/data-types/#file + default -> null; }; } @@ -488,96 +608,4 @@ public class GenerateOpenApiSpecAction extends AbstractQActionFunction swagger = new LinkedHashMap<>(); - // swagger.put("openapi", "3.0.3"); - // - // LinkedHashMap info = new LinkedHashMap<>(); - // swagger.put("info", info); - // - // // todo - add a whole section of this to meta data? - // info.put("title", "QQQ API"); - // info.put("description", """ - // This is your api description! - // """); - // info.put("termsOfService", "http://swagger.io/terms/"); - // info.put("contact", new LinkedHashMap<>(MapBuilder.of("email", "apiteam@swagger.io"))); - // info.put("license", new LinkedHashMap<>(MapBuilder.of( - // "name", "Apache 2.0", - // "url", "http://www.apache.org/licenses/LICENSE-2.0.html" - // ))); - // info.put("version", "1.0.11"); - // - // swagger.put("externalDocs", new LinkedHashMap<>(MapBuilder.of( - // "description", "Find out more at:", - // "url", "http://swagger.io" - // ))); - // swagger.put("servers", new LinkedHashMap<>(MapBuilder.of( - // "url", new ArrayList<>(ListBuilder.of("https://petstore3.swagger.io/api/v3")) - // ))); - // - // ArrayList> tags = new ArrayList<>(); - // swagger.put("tags", tags); - // for(QTableMetaData table : qInstance.getTables().values()) - // { - // tags.add(new LinkedHashMap<>(MapBuilder.of( - // "name", table.getName(), - // "description", "Operations on the " + table.getLabel() + " table." - // ))); - // } - // - // LinkedHashMap paths = new LinkedHashMap<>(); - // swagger.put("paths", paths); - // for(QTableMetaData table : qInstance.getTables().values()) - // { - // String primaryKeyLabel = table.getField(table.getPrimaryKeyField()).getLabel(); - // String primaryKeyName = table.getPrimaryKeyField(); - // - // LinkedHashMap path = new LinkedHashMap<>(); - // paths.put("/" + table.getName() + "/{" + primaryKeyName + "}", path); - // - // LinkedHashMap get = new LinkedHashMap<>(MapBuilder.of( - // "tags", new ArrayList<>(ListBuilder.of(table.getName())), - // "summary", "Find " + table.getLabel() + " by " + primaryKeyLabel + ".", - // "description", "Returns a single " + table.getLabel(), - // "operationId", "get" + StringUtils.ucFirst(table.getName()) + "By" + StringUtils.ucFirst(primaryKeyName), - // "parameters", new ArrayList<>(ListBuilder.of( - // new LinkedHashMap<>(MapBuilder.of( - // "name", primaryKeyName, - // "in", "path", - // "description", primaryKeyLabel + " of " + table.getLabel() + " to return", - // "required", true, - // "schema", new LinkedHashMap<>(MapBuilder.of( - // "type", "integer", // todo - get from field/type. - // "format", "int32" - // ) - // )) - // ))), - // "responses", new LinkedHashMap<>(MapBuilder.of( - // "200", new LinkedHashMap<>(MapBuilder.of( - // "description", "Successfully got " + table.getLabel() - // )), - // "401", new LinkedHashMap<>(MapBuilder.of( - // "description", "Unauthorized. Security credentials were eitehr missing or invalid." - // )), - // "403", new LinkedHashMap<>(MapBuilder.of( - // "description", "Forbidden. The credentials provided do not have permission to access the requested resource." - // )) - // )) - // )); - // - // path.put("get", get); - // } - // - // System.out.println(YamlUtils.toYaml(swagger)); - // - // return null; - // } } diff --git a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/model/openapi/RequestBody.java b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/model/openapi/RequestBody.java index dc6406b4..318f49b0 100644 --- a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/model/openapi/RequestBody.java +++ b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/model/openapi/RequestBody.java @@ -22,7 +22,7 @@ package com.kingsrook.qqq.api.model.openapi; -import java.util.List; +import java.util.Map; /******************************************************************************* @@ -30,9 +30,9 @@ import java.util.List; *******************************************************************************/ public class RequestBody { - private Boolean required = false; - private String description; - private List content; + private Boolean required = false; + private String description; + private Map content; @@ -101,7 +101,7 @@ public class RequestBody /******************************************************************************* ** Getter for content *******************************************************************************/ - public List getContent() + public Map getContent() { return (this.content); } @@ -111,7 +111,7 @@ public class RequestBody /******************************************************************************* ** Setter for content *******************************************************************************/ - public void setContent(List content) + public void setContent(Map content) { this.content = content; } @@ -121,7 +121,7 @@ public class RequestBody /******************************************************************************* ** Fluent setter for content *******************************************************************************/ - public RequestBody withContent(List content) + public RequestBody withContent(Map content) { this.content = content; return (this); diff --git a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/model/openapi/Schema.java b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/model/openapi/Schema.java index 17ab6b48..3641f66b 100644 --- a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/model/openapi/Schema.java +++ b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/model/openapi/Schema.java @@ -33,6 +33,7 @@ import com.fasterxml.jackson.annotation.JsonGetter; public class Schema { private String type; + private String format; private String description; private List enumValues; private Schema items; @@ -74,6 +75,37 @@ public class Schema + /******************************************************************************* + ** Getter for format + *******************************************************************************/ + public String getFormat() + { + return (this.format); + } + + + + /******************************************************************************* + ** Setter for format + *******************************************************************************/ + public void setFormat(String format) + { + this.format = format; + } + + + + /******************************************************************************* + ** Fluent setter for format + *******************************************************************************/ + public Schema withFormat(String format) + { + this.format = format; + return (this); + } + + + /******************************************************************************* ** Getter for items *******************************************************************************/ diff --git a/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/TestUtils.java b/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/TestUtils.java index 4d6140a4..f4dc2722 100644 --- a/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/TestUtils.java +++ b/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/TestUtils.java @@ -45,7 +45,7 @@ public class TestUtils public static final String MEMORY_BACKEND_NAME = "memory"; public static final String TABLE_NAME_PERSON = "person"; - private static final String API_VERSION = "2023.Q1"; + public static final String API_VERSION = "2023.Q1"; diff --git a/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/actions/GenerateOpenApiSpecActionTest.java b/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/actions/GenerateOpenApiSpecActionTest.java index 0c9c3281..4d28bcec 100644 --- a/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/actions/GenerateOpenApiSpecActionTest.java +++ b/qqq-middleware-api/src/test/java/com/kingsrook/qqq/api/actions/GenerateOpenApiSpecActionTest.java @@ -23,6 +23,7 @@ package com.kingsrook.qqq.api.actions; import com.kingsrook.qqq.api.BaseTest; +import com.kingsrook.qqq.api.TestUtils; import com.kingsrook.qqq.api.model.APIVersion; import com.kingsrook.qqq.api.model.actions.GenerateOpenApiSpecInput; import com.kingsrook.qqq.api.model.actions.GenerateOpenApiSpecOutput; @@ -48,7 +49,7 @@ class GenerateOpenApiSpecActionTest extends BaseTest @Test void test() throws QException { - String version = "2023.03"; + String version = TestUtils.API_VERSION; QInstance qInstance = QContext.getQInstance(); qInstance.withMiddlewareMetaData(new ApiInstanceMetaData() @@ -58,6 +59,7 @@ class GenerateOpenApiSpecActionTest extends BaseTest for(QTableMetaData table : qInstance.getTables().values()) { table.withMiddlewareMetaData(new ApiTableMetaData().withInitialVersion(version)); + break; } new QInstanceEnricher(qInstance).enrich();