diff --git a/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/ApiFieldUtils.java b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/ApiFieldUtils.java
new file mode 100644
index 00000000..79235273
--- /dev/null
+++ b/qqq-middleware-api/src/main/java/com/kingsrook/qqq/api/actions/ApiFieldUtils.java
@@ -0,0 +1,106 @@
+/*
+ * QQQ - Low-code Application Framework for Engineers.
+ * Copyright (C) 2021-2023. Kingsrook, LLC
+ * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
+ * contact@kingsrook.com
+ * https://github.com/Kingsrook/
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package com.kingsrook.qqq.api.actions;
+
+
+import com.kingsrook.qqq.api.model.APIVersionRange;
+import com.kingsrook.qqq.api.model.metadata.fields.ApiFieldMetaData;
+import com.kingsrook.qqq.api.model.metadata.fields.ApiFieldMetaDataContainer;
+import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData;
+import com.kingsrook.qqq.backend.core.utils.ObjectUtils;
+import com.kingsrook.qqq.backend.core.utils.StringUtils;
+import org.apache.commons.lang.BooleanUtils;
+
+
+/*******************************************************************************
+ ** utility methods for working with fields
+ **
+ *******************************************************************************/
+public class ApiFieldUtils
+{
+
+
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ public static boolean isIncluded(String apiName, QFieldMetaData field)
+ {
+ ApiFieldMetaData apiFieldMetaData = getApiFieldMetaData(apiName, field);
+ if(apiFieldMetaData != null && BooleanUtils.isTrue(apiFieldMetaData.getIsExcluded()))
+ {
+ return (false);
+ }
+
+ return (true);
+ }
+
+
+
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ public static APIVersionRange getApiVersionRangeForRemovedField(String apiName, QFieldMetaData field)
+ {
+ ApiFieldMetaData apiFieldMetaData = getApiFieldMetaData(apiName, field);
+ if(apiFieldMetaData != null && apiFieldMetaData.getInitialVersion() != null)
+ {
+ if(StringUtils.hasContent(apiFieldMetaData.getFinalVersion()))
+ {
+ return (APIVersionRange.betweenAndIncluding(apiFieldMetaData.getInitialVersion(), apiFieldMetaData.getFinalVersion()));
+ }
+ else
+ {
+ throw (new IllegalStateException("RemovedApiFieldMetaData for field [" + field.getName() + "] did not specify a finalVersion."));
+ }
+ }
+ else
+ {
+ throw (new IllegalStateException("RemovedApiFieldMetaData for field [" + field.getName() + "] did not specify an initialVersion."));
+ }
+ }
+
+
+
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ public static APIVersionRange getApiVersionRange(String apiName, QFieldMetaData field)
+ {
+ ApiFieldMetaData apiFieldMetaData = getApiFieldMetaData(apiName, field);
+ if(apiFieldMetaData != null && apiFieldMetaData.getInitialVersion() != null)
+ {
+ return (APIVersionRange.afterAndIncluding(apiFieldMetaData.getInitialVersion()));
+ }
+
+ return (APIVersionRange.none());
+ }
+
+
+
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ public static ApiFieldMetaData getApiFieldMetaData(String apiName, QFieldMetaData field)
+ {
+ return ObjectUtils.tryAndRequireNonNullElse(() -> ApiFieldMetaDataContainer.of(field).getApiFieldMetaData(apiName), new ApiFieldMetaData());
+ }
+}
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 247242b1..c6eda4c5 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
@@ -111,7 +111,7 @@ public class GenerateOpenApiSpecAction extends AbstractQActionFunction tags)
+ private Path generateProcessSpecPathObject(ApiInstanceMetaData apiInstanceMetaData, ApiProcessMetaData apiProcessMetaData, QProcessMetaData processMetaData, List tags, APIVersion apiVersion)
{
String description = apiProcessMetaData.getDescription();
if(!StringUtils.hasContent(description))
@@ -927,7 +927,10 @@ public class GenerateOpenApiSpecAction extends AbstractQActionFunction ApiFieldMetaDataContainer.of(field).getApiFieldMetaData(apiName), new ApiFieldMetaData());
- }
-
-
-
/*******************************************************************************
**
*******************************************************************************/