QQQ-21 adding processRecords

This commit is contained in:
2022-07-11 09:10:57 -05:00
parent 30770c05b2
commit 492ee321a1
6 changed files with 77 additions and 76 deletions

View File

@ -53,7 +53,7 @@
<dependency> <dependency>
<groupId>com.kingsrook.qqq</groupId> <groupId>com.kingsrook.qqq</groupId>
<artifactId>qqq-backend-core</artifactId> <artifactId>qqq-backend-core</artifactId>
<version>0.1.0-20220708.203555-6</version> <version>0.1.0-20220711.141150-7</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.kingsrook.qqq</groupId> <groupId>com.kingsrook.qqq</groupId>

View File

@ -147,7 +147,7 @@ public class QJavalinImplementation
void startJavalinServer(int port) void startJavalinServer(int port)
{ {
// todo port from arg // 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 = Javalin.create().start(port);
service.routes(getRoutes()); service.routes(getRoutes());
} }
@ -198,10 +198,8 @@ public class QJavalinImplementation
{ {
get("/", QJavalinImplementation::dataQuery); get("/", QJavalinImplementation::dataQuery);
post("/", QJavalinImplementation::dataInsert); // todo - internal to that method, if input is a list, do a bulk - else, single. post("/", QJavalinImplementation::dataInsert); // todo - internal to that method, if input is a list, do a bulk - else, single.
path("/count", () -> get("/count", QJavalinImplementation::dataCount);
{
get("", 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. // 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", () -> path("/:primaryKey", () ->
{ {

View File

@ -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 <https://www.gnu.org/licenses/>.
*/
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<String, Serializable> getFieldValues(List<QFieldMetaData> fields)
{
LOG.warn("Getting field values in javalin is NOT yet implemented");
return (new HashMap<>());
}
}

View File

@ -29,6 +29,7 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.TimeUnit; 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.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.query.QFilterCriteria; 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.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.QFieldMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; 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 public class QJavalinProcessHandler
{ {
@ -96,6 +98,7 @@ public class QJavalinProcessHandler
{ {
post("/step/:step", QJavalinProcessHandler::processStep); post("/step/:step", QJavalinProcessHandler::processStep);
get("/status/:jobUUID", QJavalinProcessHandler::processStatus); 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<ProcessState> 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<QRecord> records = processState.getRecords();
if(CollectionUtils.nullSafeIsEmpty(records))
{
throw (new Exception("No records were found for the process."));
}
Map<String, Object> resultForCaller = new HashMap<>();
List<QRecord> recordPage = CollectionUtils.safelyGetPage(records, skip, limit);
resultForCaller.put("records", recordPage);
context.result(JsonUtils.toJson(resultForCaller));
}
catch(Exception e)
{
QJavalinImplementation.handleException(context, e);
}
}
/******************************************************************************* /*******************************************************************************
** **
*******************************************************************************/ *******************************************************************************/

View File

@ -32,6 +32,7 @@ import com.kingsrook.qqq.backend.core.model.actions.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.utils.JsonUtils; import com.kingsrook.qqq.backend.core.utils.JsonUtils;
import kong.unirest.HttpResponse; import kong.unirest.HttpResponse;
import kong.unirest.Unirest; import kong.unirest.Unirest;
import org.json.JSONArray;
import org.json.JSONObject; import org.json.JSONObject;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
@ -46,7 +47,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
*******************************************************************************/ *******************************************************************************/
class QJavalinProcessHandlerTest extends QJavalinTestBase 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; private static final int LESS_THAN_TIMEOUT = 50;
@ -79,7 +80,7 @@ class QJavalinProcessHandlerTest extends QJavalinTestBase
JSONObject jsonObject = JsonUtils.toJSONObject(response.getBody()); JSONObject jsonObject = JsonUtils.toJSONObject(response.getBody());
assertNotNull(jsonObject); assertNotNull(jsonObject);
assertTrue(jsonObject.has("error")); 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); return (jsonObject);
} }
/*******************************************************************************
** test getting records back from a process
**
*******************************************************************************/
@Test
public void test_processRecords()
{
HttpResponse<String> 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"));
}
} }

View File

@ -47,7 +47,7 @@ public class QJavalinTestBase
public static void beforeAll() public static void beforeAll()
{ {
qJavalinImplementation = new QJavalinImplementation(TestUtils.defineInstance()); qJavalinImplementation = new QJavalinImplementation(TestUtils.defineInstance());
QJavalinProcessHandler.setAsyncStepTimeoutMillis(250); QJavalinProcessHandler.setAsyncStepTimeoutMillis(500);
qJavalinImplementation.startJavalinServer(PORT); qJavalinImplementation.startJavalinServer(PORT);
} }