diff --git a/pom.xml b/pom.xml
index 8f5d6e69..06def7f3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -53,7 +53,7 @@
com.kingsrook.qqq
qqq-backend-core
- 0.1.0-20220708.203555-6
+ 0.1.0-20220711.141150-7
com.kingsrook.qqq
diff --git a/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java b/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java
index ec05e05c..56830ab3 100644
--- a/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java
+++ b/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java
@@ -147,7 +147,7 @@ public class QJavalinImplementation
void startJavalinServer(int port)
{
// todo port from arg
- // todo base path from arg?
+ // todo base path from arg? - and then potentially multiple instances too (chosen based on the root path??)
service = Javalin.create().start(port);
service.routes(getRoutes());
}
@@ -198,10 +198,8 @@ public class QJavalinImplementation
{
get("/", QJavalinImplementation::dataQuery);
post("/", QJavalinImplementation::dataInsert); // todo - internal to that method, if input is a list, do a bulk - else, single.
- path("/count", () ->
- {
- get("", QJavalinImplementation::dataCount);
- });
+ get("/count", QJavalinImplementation::dataCount);
+
// todo - add put and/or patch at this level (without a primaryKey) to do a bulk update based on primaryKeys in the records.
path("/:primaryKey", () ->
{
diff --git a/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessCallback.java b/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessCallback.java
deleted file mode 100644
index 328a66b2..00000000
--- a/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessCallback.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * QQQ - Low-code Application Framework for Engineers.
- * Copyright (C) 2021-2022. 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.backend.javalin;
-
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import com.kingsrook.qqq.backend.core.callbacks.QProcessCallback;
-import com.kingsrook.qqq.backend.core.model.actions.query.QQueryFilter;
-import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-
-
-/*******************************************************************************
- **
- *******************************************************************************/
-public class QJavalinProcessCallback implements QProcessCallback
-{
- private static final Logger LOG = LogManager.getLogger(QJavalinProcessCallback.class);
-
-
-
- /*******************************************************************************
- **
- *******************************************************************************/
- @Override
- public QQueryFilter getQueryFilter()
- {
- LOG.warn("Getting a query filter in javalin is NOT yet implemented");
- return (new QQueryFilter());
- }
-
-
-
- /*******************************************************************************
- **
- *******************************************************************************/
- @Override
- public Map getFieldValues(List fields)
- {
- LOG.warn("Getting field values in javalin is NOT yet implemented");
- return (new HashMap<>());
- }
-}
diff --git a/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessHandler.java b/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessHandler.java
index b2e007ee..f14f7302 100644
--- a/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessHandler.java
+++ b/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessHandler.java
@@ -29,6 +29,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
@@ -47,6 +48,7 @@ import com.kingsrook.qqq.backend.core.model.actions.processes.RunProcessResult;
import com.kingsrook.qqq.backend.core.model.actions.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.query.QQueryFilter;
+import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData;
@@ -68,7 +70,7 @@ import static io.javalin.apibuilder.ApiBuilder.post;
/*******************************************************************************
- **
+ ** methods for handling qqq processes in javalin.
*******************************************************************************/
public class QJavalinProcessHandler
{
@@ -96,6 +98,7 @@ public class QJavalinProcessHandler
{
post("/step/:step", QJavalinProcessHandler::processStep);
get("/status/:jobUUID", QJavalinProcessHandler::processStatus);
+ get("/records", QJavalinProcessHandler::processRecords);
});
});
});
@@ -383,6 +386,43 @@ public class QJavalinProcessHandler
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ private static void processRecords(Context context)
+ {
+ try
+ {
+ String processUUID = context.pathParam("processUUID");
+ Integer skip = Objects.requireNonNullElse(QJavalinImplementation.integerQueryParam(context, "skip"), 0);
+ Integer limit = Objects.requireNonNullElse(QJavalinImplementation.integerQueryParam(context, "limit"), 20);
+
+ Optional optionalProcessState = RunProcessAction.getStateProvider().get(ProcessState.class, new UUIDAndTypeStateKey(UUID.fromString(processUUID), StateType.PROCESS_STATUS));
+ if(optionalProcessState.isEmpty())
+ {
+ throw (new Exception("Could not find process results."));
+ }
+ ProcessState processState = optionalProcessState.get();
+
+ List records = processState.getRecords();
+ if(CollectionUtils.nullSafeIsEmpty(records))
+ {
+ throw (new Exception("No records were found for the process."));
+ }
+
+ Map resultForCaller = new HashMap<>();
+ List recordPage = CollectionUtils.safelyGetPage(records, skip, limit);
+ resultForCaller.put("records", recordPage);
+ context.result(JsonUtils.toJson(resultForCaller));
+ }
+ catch(Exception e)
+ {
+ QJavalinImplementation.handleException(context, e);
+ }
+ }
+
+
+
/*******************************************************************************
**
*******************************************************************************/
diff --git a/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessHandlerTest.java b/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessHandlerTest.java
index b1644e49..548b4f39 100644
--- a/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessHandlerTest.java
+++ b/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinProcessHandlerTest.java
@@ -32,6 +32,7 @@ import com.kingsrook.qqq.backend.core.model.actions.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.utils.JsonUtils;
import kong.unirest.HttpResponse;
import kong.unirest.Unirest;
+import org.json.JSONArray;
import org.json.JSONObject;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -46,7 +47,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
*******************************************************************************/
class QJavalinProcessHandlerTest extends QJavalinTestBase
{
- private static final int MORE_THAN_TIMEOUT = 500;
+ private static final int MORE_THAN_TIMEOUT = 1000;
private static final int LESS_THAN_TIMEOUT = 50;
@@ -79,7 +80,7 @@ class QJavalinProcessHandlerTest extends QJavalinTestBase
JSONObject jsonObject = JsonUtils.toJSONObject(response.getBody());
assertNotNull(jsonObject);
assertTrue(jsonObject.has("error"));
- assertTrue(jsonObject.getString("error").contains("missing input records"));
+ assertTrue(jsonObject.getString("error").contains("Missing input records"));
}
@@ -395,4 +396,32 @@ class QJavalinProcessHandlerTest extends QJavalinTestBase
return (jsonObject);
}
+
+
+
+ /*******************************************************************************
+ ** test getting records back from a process
+ **
+ *******************************************************************************/
+ @Test
+ public void test_processRecords()
+ {
+ HttpResponse response = Unirest.get(BASE_URL + "/processes/greet/init?recordsParam=recordIds&recordIds=2,3&greetingPrefix=Hey&greetingSuffix=Jude").asString();
+ assertEquals(200, response.getStatus());
+ JSONObject jsonObject = JsonUtils.toJSONObject(response.getBody());
+ assertNotNull(jsonObject);
+ String processUUID = jsonObject.getString("processUUID");
+
+ response = Unirest.get(BASE_URL + "/processes/greet/" + processUUID + "/records").asString();
+ jsonObject = JsonUtils.toJSONObject(response.getBody());
+ assertNotNull(jsonObject);
+ assertTrue(jsonObject.has("records"));
+ JSONArray records = jsonObject.getJSONArray("records");
+ assertEquals(2, records.length());
+ JSONObject record0 = records.getJSONObject(0);
+ JSONObject values = record0.getJSONObject("values");
+ assertTrue(values.has("id"));
+ assertTrue(values.has("firstName"));
+ }
+
}
\ No newline at end of file
diff --git a/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinTestBase.java b/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinTestBase.java
index 168174c2..54dc47a5 100644
--- a/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinTestBase.java
+++ b/src/test/java/com/kingsrook/qqq/backend/javalin/QJavalinTestBase.java
@@ -47,7 +47,7 @@ public class QJavalinTestBase
public static void beforeAll()
{
qJavalinImplementation = new QJavalinImplementation(TestUtils.defineInstance());
- QJavalinProcessHandler.setAsyncStepTimeoutMillis(250);
+ QJavalinProcessHandler.setAsyncStepTimeoutMillis(500);
qJavalinImplementation.startJavalinServer(PORT);
}