Minor cleanups wrapping up app-api-version in middleware api

This commit is contained in:
2025-05-27 16:42:39 -05:00
parent 6314ad310b
commit add41a852b
3 changed files with 27 additions and 26 deletions

View File

@ -28,7 +28,6 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; 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.CollectionUtils;
import com.kingsrook.qqq.backend.core.utils.JsonUtils; import com.kingsrook.qqq.backend.core.utils.JsonUtils;
import com.kingsrook.qqq.backend.core.utils.StringUtils; 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.core.utils.collections.MapBuilder;
import com.kingsrook.qqq.backend.javalin.QJavalinImplementation; import com.kingsrook.qqq.backend.javalin.QJavalinImplementation;
import com.kingsrook.qqq.middleware.javalin.specs.AbstractMiddlewareVersion; 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 com.kingsrook.qqq.openapi.model.OpenAPI;
import io.javalin.apibuilder.ApiBuilder; import io.javalin.apibuilder.ApiBuilder;
import io.javalin.apibuilder.EndpointGroup; import io.javalin.apibuilder.EndpointGroup;
@ -100,18 +98,18 @@ public class QMiddlewareApiSpecHandler
//////////////////////////////////////////// ////////////////////////////////////////////
// default page for a version is its spec // // default page for a version is its spec //
//////////////////////////////////////////// ////////////////////////////////////////////
for(AbstractMiddlewareVersion middlewareSpec : middlewareVersionList) for(AbstractMiddlewareVersion middlewareVersion : middlewareVersionList)
{ {
String version = middlewareSpec.getVersion(); String version = middlewareVersion.getVersion();
String versionPath = "/" + basePath + middlewareSpec.getVersionBasePath(); String versionPath = "/" + basePath + middlewareVersion.getVersionBasePath();
ApiBuilder.get(versionPath + "/", context -> doSpecHtml(context, version)); ApiBuilder.get(versionPath + "/", context -> doSpecHtml(middlewareVersion, context, version));
/////////////////////////////////////////// ///////////////////////////////////////////
// add known paths for specs & docs page // // add known paths for specs & docs page //
/////////////////////////////////////////// ///////////////////////////////////////////
ApiBuilder.get(versionPath + "/openapi.yaml", context -> doSpecYaml(context, version)); ApiBuilder.get(versionPath + "/openapi.yaml", context -> doSpecYaml(middlewareVersion, context, version));
ApiBuilder.get(versionPath + "/openapi.json", context -> doSpecJson(context, version)); ApiBuilder.get(versionPath + "/openapi.json", context -> doSpecJson(middlewareVersion, context, version));
ApiBuilder.get(versionPath + "/openapi.html", context -> doSpecHtml(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 try
{ {
OpenAPI openAPI = new MiddlewareVersionV1().generateOpenAPIModel(basePath); OpenAPI openAPI = middlewareVersion.generateOpenAPIModel(basePath);
context.contentType(ContentType.APPLICATION_YAML); context.contentType(ContentType.APPLICATION_YAML);
context.result(YamlUtils.toYaml(openAPI)); 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 try
{ {
OpenAPI openAPI = new MiddlewareVersionV1().generateOpenAPIModel(basePath); OpenAPI openAPI = middlewareVersion.generateOpenAPIModel(basePath);
context.contentType(ContentType.APPLICATION_JSON); context.contentType(ContentType.APPLICATION_JSON);
context.result(JsonUtils.toJson(openAPI)); context.result(JsonUtils.toJson(openAPI));
} }
@ -210,11 +208,14 @@ public class QMiddlewareApiSpecHandler
if(!StringUtils.hasContent(version)) if(!StringUtils.hasContent(version))
{ {
List<String> supportedVersions = middlewareVersionList.stream().map(msi -> msi.getVersion()).toList(); List<String> supportedVersions = middlewareVersionList.stream().map(mv -> mv.getVersion()).toList();
version = supportedVersions.get(supportedVersions.size() - 1); version = supportedVersions.get(supportedVersions.size() - 1);
} }
doSpecHtml(context, version); String finalVersion = version;
Optional<AbstractMiddlewareVersion> 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 try
{ {
@ -240,13 +241,7 @@ public class QMiddlewareApiSpecHandler
html = html.replace("{primaryColor}", "#444444"); html = html.replace("{primaryColor}", "#444444");
html = html.replace("{navLogoImg}", "<img id=\"navLogo\" slot=\"nav-logo\" src=\"/images/qqq-api-logo.png\" />"); html = html.replace("{navLogoImg}", "<img id=\"navLogo\" slot=\"nav-logo\" src=\"/images/qqq-api-logo.png\" />");
Optional<AbstractMiddlewareVersion> middlewareSpec = middlewareVersionList.stream().filter(msi -> msi.getVersion().equals(version)).findFirst(); OpenAPI openAPI = middlewareVersion.generateOpenAPIModel(basePath);
if(middlewareSpec.isEmpty())
{
throw (new QUserFacingException("Unrecognized version: " + version));
}
OpenAPI openAPI = middlewareSpec.get().generateOpenAPIModel(basePath);
html = html.replace("{title}", openAPI.getInfo().getTitle() + " - " + version); html = html.replace("{title}", openAPI.getInfo().getTitle() + " - " + version);
StringBuilder otherVersionOptions = new StringBuilder(); StringBuilder otherVersionOptions = new StringBuilder();

View File

@ -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.model.metadata.QInstance;
import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.core.utils.CollectionUtils;
import com.kingsrook.qqq.backend.core.utils.JsonUtils; 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.core.utils.ValueUtils;
import com.kingsrook.qqq.backend.javalin.QJavalinUtils; import com.kingsrook.qqq.backend.javalin.QJavalinUtils;
import com.kingsrook.qqq.middleware.javalin.executors.AbstractMiddlewareExecutor; import com.kingsrook.qqq.middleware.javalin.executors.AbstractMiddlewareExecutor;
@ -160,6 +161,7 @@ public abstract class AbstractEndpointSpec<
final Handler handler = context -> serveRequest(abstractMiddlewareVersion, context); final Handler handler = context -> serveRequest(abstractMiddlewareVersion, context);
LOG.trace("Binding: " + completeOperation.getHttpMethod() + " " + fullPath);
switch(completeOperation.getHttpMethod()) switch(completeOperation.getHttpMethod())
{ {
case GET -> ApiBuilder.get(fullPath, handler); case GET -> ApiBuilder.get(fullPath, handler);
@ -409,8 +411,12 @@ public abstract class AbstractEndpointSpec<
if(jsonObject == null) if(jsonObject == null)
{ {
jsonObject = new JSONObject(context.body()); String body = context.body();
context.attribute("jsonBody", jsonObject); if(StringUtils.hasContent(body))
{
jsonObject = new JSONObject(body);
context.attribute("jsonBody", jsonObject);
}
} }
return (jsonObject); return (jsonObject);

View File

@ -374,7 +374,7 @@ public abstract class AbstractMiddlewareVersion
/*************************************************************************** /***************************************************************************
** **
***************************************************************************/ ***************************************************************************/
public void preExecute(Context context) public void preExecute(Context context) throws QException
{ {
///////////////////// /////////////////////
// noop at default // // noop at default //