diff --git a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/QMiddlewareApiSpecHandler.java b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/QMiddlewareApiSpecHandler.java index bd7e8fd6..c13605dd 100644 --- a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/QMiddlewareApiSpecHandler.java +++ b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/QMiddlewareApiSpecHandler.java @@ -28,7 +28,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; -import com.kingsrook.qqq.backend.core.exceptions.QUserFacingException; import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.core.utils.JsonUtils; import com.kingsrook.qqq.backend.core.utils.StringUtils; @@ -36,7 +35,6 @@ import com.kingsrook.qqq.backend.core.utils.YamlUtils; import com.kingsrook.qqq.backend.core.utils.collections.MapBuilder; import com.kingsrook.qqq.backend.javalin.QJavalinImplementation; import com.kingsrook.qqq.middleware.javalin.specs.AbstractMiddlewareVersion; -import com.kingsrook.qqq.middleware.javalin.specs.v1.MiddlewareVersionV1; import com.kingsrook.qqq.openapi.model.OpenAPI; import io.javalin.apibuilder.ApiBuilder; import io.javalin.apibuilder.EndpointGroup; @@ -100,18 +98,18 @@ public class QMiddlewareApiSpecHandler //////////////////////////////////////////// // default page for a version is its spec // //////////////////////////////////////////// - for(AbstractMiddlewareVersion middlewareSpec : middlewareVersionList) + for(AbstractMiddlewareVersion middlewareVersion : middlewareVersionList) { - String version = middlewareSpec.getVersion(); - String versionPath = "/" + basePath + middlewareSpec.getVersionBasePath(); - ApiBuilder.get(versionPath + "/", context -> doSpecHtml(context, version)); + String version = middlewareVersion.getVersion(); + String versionPath = "/" + basePath + middlewareVersion.getVersionBasePath(); + ApiBuilder.get(versionPath + "/", context -> doSpecHtml(middlewareVersion, context, version)); /////////////////////////////////////////// // add known paths for specs & docs page // /////////////////////////////////////////// - ApiBuilder.get(versionPath + "/openapi.yaml", context -> doSpecYaml(context, version)); - ApiBuilder.get(versionPath + "/openapi.json", context -> doSpecJson(context, version)); - ApiBuilder.get(versionPath + "/openapi.html", context -> doSpecHtml(context, version)); + ApiBuilder.get(versionPath + "/openapi.yaml", context -> doSpecYaml(middlewareVersion, context, version)); + ApiBuilder.get(versionPath + "/openapi.json", context -> doSpecJson(middlewareVersion, context, version)); + ApiBuilder.get(versionPath + "/openapi.html", context -> doSpecHtml(middlewareVersion, context, version)); } }); } @@ -155,11 +153,11 @@ public class QMiddlewareApiSpecHandler /******************************************************************************* ** *******************************************************************************/ - private void doSpecYaml(Context context, String version) + private void doSpecYaml(AbstractMiddlewareVersion middlewareVersion, Context context, String version) { try { - OpenAPI openAPI = new MiddlewareVersionV1().generateOpenAPIModel(basePath); + OpenAPI openAPI = middlewareVersion.generateOpenAPIModel(basePath); context.contentType(ContentType.APPLICATION_YAML); context.result(YamlUtils.toYaml(openAPI)); } @@ -174,11 +172,11 @@ public class QMiddlewareApiSpecHandler /******************************************************************************* ** *******************************************************************************/ - private void doSpecJson(Context context, String version) + private void doSpecJson(AbstractMiddlewareVersion middlewareVersion, Context context, String version) { try { - OpenAPI openAPI = new MiddlewareVersionV1().generateOpenAPIModel(basePath); + OpenAPI openAPI = middlewareVersion.generateOpenAPIModel(basePath); context.contentType(ContentType.APPLICATION_JSON); context.result(JsonUtils.toJson(openAPI)); } @@ -210,11 +208,14 @@ public class QMiddlewareApiSpecHandler if(!StringUtils.hasContent(version)) { - List supportedVersions = middlewareVersionList.stream().map(msi -> msi.getVersion()).toList(); + List supportedVersions = middlewareVersionList.stream().map(mv -> mv.getVersion()).toList(); version = supportedVersions.get(supportedVersions.size() - 1); } - doSpecHtml(context, version); + String finalVersion = version; + Optional optionalMiddlewareVersion = middlewareVersionList.stream().filter(mv -> mv.getVersion().equals(finalVersion)).findFirst(); + + doSpecHtml(optionalMiddlewareVersion.orElseThrow(), context, version); } @@ -222,7 +223,7 @@ public class QMiddlewareApiSpecHandler /******************************************************************************* ** *******************************************************************************/ - private void doSpecHtml(Context context, String version) + private void doSpecHtml(AbstractMiddlewareVersion middlewareVersion, Context context, String version) { try { @@ -240,13 +241,7 @@ public class QMiddlewareApiSpecHandler html = html.replace("{primaryColor}", "#444444"); html = html.replace("{navLogoImg}", ""); - Optional middlewareSpec = middlewareVersionList.stream().filter(msi -> msi.getVersion().equals(version)).findFirst(); - if(middlewareSpec.isEmpty()) - { - throw (new QUserFacingException("Unrecognized version: " + version)); - } - - OpenAPI openAPI = middlewareSpec.get().generateOpenAPIModel(basePath); + OpenAPI openAPI = middlewareVersion.generateOpenAPIModel(basePath); html = html.replace("{title}", openAPI.getInfo().getTitle() + " - " + version); StringBuilder otherVersionOptions = new StringBuilder(); diff --git a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/specs/AbstractEndpointSpec.java b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/specs/AbstractEndpointSpec.java index d56332b8..3c43b672 100644 --- a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/specs/AbstractEndpointSpec.java +++ b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/specs/AbstractEndpointSpec.java @@ -37,6 +37,7 @@ import com.kingsrook.qqq.backend.core.logging.QLogger; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.core.utils.JsonUtils; +import com.kingsrook.qqq.backend.core.utils.StringUtils; import com.kingsrook.qqq.backend.core.utils.ValueUtils; import com.kingsrook.qqq.backend.javalin.QJavalinUtils; import com.kingsrook.qqq.middleware.javalin.executors.AbstractMiddlewareExecutor; @@ -160,6 +161,7 @@ public abstract class AbstractEndpointSpec< final Handler handler = context -> serveRequest(abstractMiddlewareVersion, context); + LOG.trace("Binding: " + completeOperation.getHttpMethod() + " " + fullPath); switch(completeOperation.getHttpMethod()) { case GET -> ApiBuilder.get(fullPath, handler); @@ -409,8 +411,12 @@ public abstract class AbstractEndpointSpec< if(jsonObject == null) { - jsonObject = new JSONObject(context.body()); - context.attribute("jsonBody", jsonObject); + String body = context.body(); + if(StringUtils.hasContent(body)) + { + jsonObject = new JSONObject(body); + context.attribute("jsonBody", jsonObject); + } } return (jsonObject); diff --git a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/specs/AbstractMiddlewareVersion.java b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/specs/AbstractMiddlewareVersion.java index 6351d644..229e899b 100644 --- a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/specs/AbstractMiddlewareVersion.java +++ b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/middleware/javalin/specs/AbstractMiddlewareVersion.java @@ -374,7 +374,7 @@ public abstract class AbstractMiddlewareVersion /*************************************************************************** ** ***************************************************************************/ - public void preExecute(Context context) + public void preExecute(Context context) throws QException { ///////////////////// // noop at default //