Compare commits
25
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
544febfc41
|
||
|
|
4262776004
|
||
|
|
f47d0f7870
|
||
|
|
4d743f2c4d | ||
|
|
a230b6f58e
|
||
|
|
9cc69d807a
|
||
|
|
12d0c09f9f
|
||
|
|
0bf2da23bb | ||
|
|
8ced11cc1d | ||
|
|
9d98f41311
|
||
|
|
49d2ea433e
|
||
|
|
67bc2d11ec
|
||
|
|
f9b832045d
|
||
|
|
8b5b29999e | ||
|
|
9442df6684 | ||
|
|
bad4c66ce0 | ||
|
|
3512db0ef8 | ||
|
|
7cbbfc9c07 | ||
|
|
cedf5e2336 | ||
|
|
7c967d0c88
|
||
|
|
5c52abdfe3 | ||
|
|
6799f645e9
|
||
|
|
a16c153e7e
|
||
|
|
67b50143ad | ||
|
|
e4d8e06719 |
No files matched your search
+10
-53
@@ -1,57 +1,14 @@
|
||||
version: 2.1
|
||||
|
||||
setup: true
|
||||
orbs:
|
||||
qqq-orb: kingsrook/qqq-orb@0.5.0
|
||||
|
||||
qqq-orb: kingsrook/qqq-orb@0.8
|
||||
workflows:
|
||||
|
||||
test_only:
|
||||
setup:
|
||||
jobs:
|
||||
- qqq-orb/mvn_test_only:
|
||||
context: [ qqq-maven-registry-credentials ]
|
||||
filters:
|
||||
branches:
|
||||
ignore: /(develop|main|release/.*|hotfix/.*|integration.*)/
|
||||
tags:
|
||||
only: []
|
||||
|
||||
publish_snapshot:
|
||||
jobs:
|
||||
- qqq-orb/mvn_publish:
|
||||
context: [ qqq-maven-registry-credentials ]
|
||||
branch_type: snapshot
|
||||
filters:
|
||||
branches:
|
||||
only:
|
||||
- develop
|
||||
|
||||
publish_release_candidate:
|
||||
jobs:
|
||||
- qqq-orb/mvn_publish:
|
||||
context: [ qqq-maven-registry-credentials ]
|
||||
branch_type: release_candidate
|
||||
filters:
|
||||
branches:
|
||||
only:
|
||||
- /release\/.*/
|
||||
|
||||
publish_release:
|
||||
jobs:
|
||||
- qqq-orb/mvn_publish:
|
||||
context: [ qqq-maven-registry-credentials ]
|
||||
branch_type: release
|
||||
filters:
|
||||
branches:
|
||||
ignore: /.*/
|
||||
tags:
|
||||
only: [ /v.*/ ]
|
||||
|
||||
publish_hotfix_release:
|
||||
jobs:
|
||||
- qqq-orb/mvn_publish:
|
||||
context: [ qqq-maven-registry-credentials ]
|
||||
branch_type: hotfix
|
||||
filters:
|
||||
branches:
|
||||
only:
|
||||
- /hotfix\/.*/
|
||||
- qqq-orb/generate_pipeline:
|
||||
orb_version: '0.8'
|
||||
filters:
|
||||
branches:
|
||||
ignore: automation/qbit-rc-pending
|
||||
tags:
|
||||
only: /v.*/
|
||||
@@ -0,0 +1,7 @@
|
||||
name: build
|
||||
on:
|
||||
push:
|
||||
jobs:
|
||||
maven:
|
||||
uses: self:KofTwentyTwo/ci-workflows/.gitea/workflows/maven.yaml@v1
|
||||
secrets: inherit
|
||||
@@ -0,0 +1,23 @@
|
||||
name: CodeQL
|
||||
'on':
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- develop
|
||||
- release/**
|
||||
- hotfix/**
|
||||
pull_request: {}
|
||||
schedule:
|
||||
- cron: 41 16 * * 0
|
||||
workflow_dispatch: {}
|
||||
permissions:
|
||||
contents: read
|
||||
actions: read
|
||||
security-events: write
|
||||
packages: read
|
||||
concurrency:
|
||||
group: codeql-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||
jobs:
|
||||
analyze:
|
||||
uses: QRun-IO/qqq-orb/.github/workflows/qbit-codeql.yml@c288a8864fe9054f68410e1d78f5863aea4c4d22
|
||||
@@ -0,0 +1,74 @@
|
||||
name: Release candidate
|
||||
'on':
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
dry_run:
|
||||
description: Plan a cut without changing release state
|
||||
type: boolean
|
||||
default: false
|
||||
finalize:
|
||||
description: Retry finalization of an existing cut; do not cut another RC
|
||||
type: boolean
|
||||
default: false
|
||||
recover:
|
||||
description: Recover the same published RC after a deployment timeout; never
|
||||
reupload
|
||||
type: boolean
|
||||
default: false
|
||||
circle_build:
|
||||
description: Original Circle publisher build number (recovery only)
|
||||
type: string
|
||||
default: ''
|
||||
merge_sha:
|
||||
description: Existing cut merge_sha (finalize retry only)
|
||||
type: string
|
||||
default: ''
|
||||
bump_sha:
|
||||
description: Existing cut bump_sha (finalize retry only)
|
||||
type: string
|
||||
default: ''
|
||||
branch:
|
||||
description: Existing cut branch (finalize retry only)
|
||||
type: string
|
||||
default: ''
|
||||
version:
|
||||
description: Existing cut version (finalize retry only)
|
||||
type: string
|
||||
default: ''
|
||||
pull_request:
|
||||
types:
|
||||
- closed
|
||||
branches:
|
||||
- develop
|
||||
repository_dispatch:
|
||||
types:
|
||||
- qbit-rc-published
|
||||
permissions:
|
||||
contents: write
|
||||
actions: read
|
||||
checks: read
|
||||
jobs:
|
||||
release-rc:
|
||||
if: github.event_name == 'workflow_dispatch' || github.event_name == 'repository_dispatch'
|
||||
|| (github.event_name == 'pull_request' && github.event.pull_request.merged
|
||||
== true && github.event.pull_request.base.ref == 'develop' && contains(github.event.pull_request.labels.*.name,
|
||||
'release:rc'))
|
||||
uses: QRun-IO/qqq-orb/.github/workflows/qbit-release-rc.yml@cc30f599e63c8e41629c99d23395bac1adb8bc44
|
||||
with:
|
||||
dry_run: ${{ github.event_name == 'workflow_dispatch' && inputs.dry_run || false
|
||||
}}
|
||||
finalize: ${{ github.event_name == 'repository_dispatch' || (github.event_name
|
||||
== 'workflow_dispatch' && inputs.finalize) }}
|
||||
recover: ${{ github.event_name == 'workflow_dispatch' && inputs.recover || false
|
||||
}}
|
||||
circle_build: ${{ github.event_name == 'workflow_dispatch' && inputs.circle_build
|
||||
|| '' }}
|
||||
merge_sha: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.merge_sha
|
||||
|| inputs.merge_sha || '' }}
|
||||
bump_sha: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.bump_sha
|
||||
|| inputs.bump_sha || '' }}
|
||||
branch: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.branch
|
||||
|| inputs.branch || '' }}
|
||||
version: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.version
|
||||
|| inputs.version || '' }}
|
||||
secrets: inherit
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
profile: qbit
|
||||
orb_version: '0.8'
|
||||
default_branch: main
|
||||
java_version: '21'
|
||||
browsers: true
|
||||
api_checks: false
|
||||
docs_only: false
|
||||
release_on_main: false
|
||||
release_tag_policy: v-prefix
|
||||
test_branch_policy: all
|
||||
publish:
|
||||
snapshot: true
|
||||
release_candidate: true
|
||||
release: true
|
||||
asciidoc: false
|
||||
release_completion: false
|
||||
@@ -24,7 +24,7 @@ This QBit provides a declarative workflow engine. Define states and transitions,
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- QQQ application (v0.35.0+)
|
||||
- QQQ application (v4.1.0+)
|
||||
- Database backend configured
|
||||
|
||||
### Installation
|
||||
|
||||
@@ -23,7 +23,8 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
|
||||
<properties>
|
||||
<revision>0.4.0</revision>
|
||||
<revision>0.5.0-SNAPSHOT</revision>
|
||||
<qqq.version>4.1.0-RC.21</qqq.version>
|
||||
</properties>
|
||||
|
||||
<parent>
|
||||
@@ -69,6 +70,19 @@
|
||||
</scm>
|
||||
|
||||
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<!-- Published QQQ 4.1 core (minimum QQQ 4.1), imported ahead of the parent's BOM. -->
|
||||
<dependency>
|
||||
<groupId>com.kingsrook.qqq</groupId>
|
||||
<artifactId>qqq-bom-pom</artifactId>
|
||||
<version>${qqq.version}</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.kingsrook.qqq</groupId>
|
||||
@@ -86,8 +100,10 @@
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.kingsrook.qqq</groupId>
|
||||
<!-- 0.27.0-RC.1 references com.kingsrook.qqq.backend.javalin.QJavalinMetaData, which QQQ 4.x moved to com.kingsrook.qqq.middleware.javalin
|
||||
(NoClassDefFoundError when the form adjusters register). 0.42.0-RC.2 is the published line for 4.x; its public API is a superset. -->
|
||||
<artifactId>qqq-frontend-material-dashboard</artifactId>
|
||||
<version>0.27.0-RC.1</version>
|
||||
<version>0.42.0-RC.2</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -98,7 +114,7 @@
|
||||
<dependency>
|
||||
<groupId>org.assertj</groupId>
|
||||
<artifactId>assertj-core</artifactId>
|
||||
<version>3.27.3</version>
|
||||
<version>3.27.7</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
+2
-1
@@ -39,6 +39,7 @@ import com.kingsrook.qbits.workflows.model.Workflow;
|
||||
import com.kingsrook.qbits.workflows.model.WorkflowRevision;
|
||||
import com.kingsrook.qbits.workflows.model.WorkflowStep;
|
||||
import com.kingsrook.qqq.api.actions.GetTableApiFieldsAction;
|
||||
import com.kingsrook.qqq.api.model.actions.GetTableApiFieldsInput;
|
||||
import com.kingsrook.qqq.api.utils.ApiQueryFilterUtils;
|
||||
import com.kingsrook.qqq.backend.core.actions.tables.GetAction;
|
||||
import com.kingsrook.qqq.backend.core.context.QContext;
|
||||
@@ -254,7 +255,7 @@ public class InputRecordFilterStep extends WorkflowStepType implements WorkflowS
|
||||
String apiName = workflowRevision.getValueString("apiName");
|
||||
String apiVersion = workflowRevision.getValueString("apiVersion");
|
||||
String tableName = workflow.getValueString("tableName");
|
||||
Map<String, QFieldMetaData> tableApiFields = GetTableApiFieldsAction.getTableApiFieldMap(new GetTableApiFieldsAction.ApiNameVersionAndTableName(apiName, apiVersion, tableName));
|
||||
Map<String, QFieldMetaData> tableApiFields = GetTableApiFieldsAction.getTableApiFieldMap(new GetTableApiFieldsInput().withApiName(apiName).withVersion(apiVersion).withTableName(tableName));
|
||||
ArrayList<String> badRequestMessages = new ArrayList<>();
|
||||
ApiQueryFilterUtils.manageCriteriaFields(filter, tableApiFields, badRequestMessages, apiName, apiVersion, new QueryInput(tableName).withFilter(filter));
|
||||
errors.addAll(badRequestMessages);
|
||||
|
||||
+2
-1
@@ -31,6 +31,7 @@ import com.kingsrook.qbits.workflows.execution.WorkflowExecutionContext;
|
||||
import com.kingsrook.qbits.workflows.model.Workflow;
|
||||
import com.kingsrook.qbits.workflows.model.WorkflowRevision;
|
||||
import com.kingsrook.qqq.api.actions.GetTableApiFieldsAction;
|
||||
import com.kingsrook.qqq.api.model.actions.GetTableApiFieldsInput;
|
||||
import com.kingsrook.qqq.api.utils.ApiQueryFilterUtils;
|
||||
import com.kingsrook.qqq.backend.core.actions.tables.CountAction;
|
||||
import com.kingsrook.qqq.backend.core.actions.tables.DeleteAction;
|
||||
@@ -179,7 +180,7 @@ public class RecordWorkflowUtils
|
||||
{
|
||||
WorkflowRevision workflowRevision = context.getWorkflowRevision();
|
||||
Workflow workflow = context.getWorkflow();
|
||||
Map<String, QFieldMetaData> tableApiFields = GetTableApiFieldsAction.getTableApiFieldMap(new GetTableApiFieldsAction.ApiNameVersionAndTableName(workflowRevision.getApiName(), workflowRevision.getApiVersion(), workflow.getTableName()));
|
||||
Map<String, QFieldMetaData> tableApiFields = GetTableApiFieldsAction.getTableApiFieldMap(new GetTableApiFieldsInput().withApiName(workflowRevision.getApiName()).withVersion(workflowRevision.getApiVersion()).withTableName(workflow.getTableName()));
|
||||
List<String> badRequestMessages = new ArrayList<>();
|
||||
|
||||
CountInput countInput = new CountInput(context.getWorkflow().getTableName())
|
||||
|
||||
+2
-2
@@ -78,9 +78,9 @@ public class RunRecordWorkflowExtractStep extends ExtractViaQueryStep
|
||||
** Make sure associations are fetched (so api records have children!)
|
||||
*******************************************************************************/
|
||||
@Override
|
||||
protected void customizeInputPreQuery(QueryInput queryInput)
|
||||
protected void customizeInputPreQuery(RunBackendStepInput runBackendStepInput, QueryInput queryInput)
|
||||
{
|
||||
super.customizeInputPreQuery(queryInput);
|
||||
super.customizeInputPreQuery(runBackendStepInput, queryInput);
|
||||
queryInput.setIncludeAssociations(true);
|
||||
}
|
||||
|
||||
|
||||
@@ -142,7 +142,7 @@ public class BaseTest
|
||||
// basic definition of an instance //
|
||||
/////////////////////////////////////
|
||||
QInstance qInstance = new QInstance();
|
||||
qInstance.setAuthentication(new QAuthenticationMetaData().withType(QAuthenticationType.FULLY_ANONYMOUS));
|
||||
qInstance.withInstanceDefaultAuthentication(new QAuthenticationMetaData().withType(QAuthenticationType.FULLY_ANONYMOUS));
|
||||
qInstance.addBackend(new RDBMSBackendMetaData()
|
||||
.withName(RDBMS_BACKEND_NAME)
|
||||
.withVendor("h2")
|
||||
|
||||
+106
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
* QQQ - Low-code Application Framework for Engineers.
|
||||
* Copyright (C) 2021-2025. 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.qbits.workflows.metadata;
|
||||
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import com.kingsrook.qbits.workflows.BaseTest;
|
||||
import com.kingsrook.qbits.workflows.WorkflowsTestDataSource;
|
||||
import com.kingsrook.qbits.workflows.implementations.recordworkflows.RecordWorkflowsDefinition;
|
||||
import com.kingsrook.qbits.workflows.model.Workflow;
|
||||
import com.kingsrook.qbits.workflows.model.WorkflowTestScenario;
|
||||
import com.kingsrook.qqq.backend.core.actions.processes.RunProcessAction;
|
||||
import com.kingsrook.qqq.backend.core.actions.tables.InsertAction;
|
||||
import com.kingsrook.qqq.backend.core.model.actions.processes.RunProcessInput;
|
||||
import com.kingsrook.qqq.backend.core.model.actions.processes.RunProcessOutput;
|
||||
import com.kingsrook.qqq.backend.core.model.actions.tables.insert.InsertInput;
|
||||
import com.kingsrook.qqq.backend.core.utils.JsonUtils;
|
||||
import com.kingsrook.qqq.frontend.materialdashboard.actions.formadjuster.RunFormAdjusterProcess;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
** Runs the workflows form adjusters through the current Material Dashboard
|
||||
** form-adjuster process, the same way the UI API's table form-adjuster route
|
||||
** does (path params + multipart-style form params) - not by calling them directly.
|
||||
*******************************************************************************/
|
||||
class WorkflowTestAssertionFormAdjusterTest extends BaseTest
|
||||
{
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@Test
|
||||
void testVariableNameAdjusterThroughMaterialDashboardProcess() throws Exception
|
||||
{
|
||||
|
||||
Workflow workflow = WorkflowsTestDataSource.insertWorkflowAndInitialRevision(RecordWorkflowsDefinition.WORKFLOW_TYPE, TABLE_NAME_PERSON);
|
||||
Integer scenarioId = new InsertAction().execute(new InsertInput(WorkflowTestScenario.TABLE_NAME).withRecordEntity(
|
||||
new WorkflowTestScenario().withWorkflowId(workflow.getId()).withName("s").withApiName(API_NAME).withApiVersion(V3).withApiJson("{}"))).getRecords().get(0).getValueInteger("id");
|
||||
|
||||
Map<String, Object> output = runAdjuster("WorkflowTestAssertion.variableName", RunFormAdjusterProcess.EVENT_ON_CHANGE,
|
||||
TABLE_NAME_PERSON + ".firstName", Map.of("workflowTestScenarioId", scenarioId));
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, Object> expectedValueField = (Map<String, Object>) ((Map<String, Object>) output.get("updatedFieldMetaData")).get("expectedValue");
|
||||
assertNotNull(expectedValueField);
|
||||
assertTrue(String.valueOf(expectedValueField.get("label")).startsWith("Expected Value ("), "label: " + expectedValueField.get("label"));
|
||||
assertEquals(List.of("expectedValue"), output.get("fieldsToClear"));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
**
|
||||
***************************************************************************/
|
||||
private Map<String, Object> runAdjuster(String identifier, String event, String newValue, Map<String, Object> allValues) throws Exception
|
||||
{
|
||||
Map<String, List<String>> formParams = new HashMap<>();
|
||||
formParams.put("event", List.of(event));
|
||||
formParams.put("fieldName", List.of("variableName"));
|
||||
formParams.put("newValue", List.of(newValue));
|
||||
formParams.put("allValues", List.of(JsonUtils.toJson(allValues)));
|
||||
|
||||
RunProcessInput input = new RunProcessInput();
|
||||
input.setProcessName(RunFormAdjusterProcess.NAME);
|
||||
input.setFrontendStepBehavior(RunProcessInput.FrontendStepBehavior.SKIP);
|
||||
input.addValue("pathParams", new HashMap<>(Map.of("identifier", identifier, "event", event)));
|
||||
input.addValue("formParams", (Serializable) formParams);
|
||||
|
||||
RunProcessOutput processOutput = new RunProcessAction().execute(input);
|
||||
if(processOutput.getException().isPresent())
|
||||
{
|
||||
throw (processOutput.getException().get());
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, Object> result = JsonUtils.toObject(processOutput.getValueString("responseString"), Map.class);
|
||||
return (result);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user