save trigger args to workflow

This commit is contained in:
Simon Larsen
2023-02-15 14:54:13 +00:00
parent 641db23180
commit 6dd0ddffb6
20 changed files with 701 additions and 36 deletions

View File

@@ -1,4 +1,5 @@
import IconProp from '../Icon/IconProp';
import { JSONObject } from '../JSON';
export enum ComponentInputType {
Text = 'Text',
@@ -27,6 +28,25 @@ export enum ComponentType {
Component = 'Component',
}
export enum NodeType {
Node = 'Node',
PlaceholderNode = 'PlaceholderNode',
}
export interface NodeDataProp {
error: string;
id: string;
nodeType: NodeType;
onClick?: (node: NodeDataProp) => void | undefined;
isPreview?: boolean | undefined; // is this used to show in the components modal?
metadata: ComponentMetadata;
metadataId: string;
internalId: string;
arguments: JSONObject;
returnValues: JSONObject;
componentType: ComponentType;
}
export interface Port {
title: string;
description: string;

View File

@@ -0,0 +1,21 @@
import { Queue as BullQueue } from 'bullmq';
import { JSONObject } from 'Common/Types/JSON';
import ObjectID from 'Common/Types/ObjectID';
import { RedisHostname, RedisPort } from '../Config';
export enum QueueName {
Workflow ="Workflow"
}
export default class Queue {
public static getQueue(queueName: QueueName): BullQueue {
return new BullQueue(queueName, { connection: {
host: RedisHostname.toString(),
port: RedisPort.toNumber()
}});
}
public static async addJob(queueName: QueueName, jobId: ObjectID, jobName: string, data: JSONObject){
await this.getQueue(queueName).add(jobName, data, {jobId: jobId.toString()});
}
}

View File

@@ -0,0 +1,11 @@
import { Worker } from 'bullmq';
import { RedisHostname, RedisPort } from '../Config';
export default class QueueWorker {
public static getWorker(queueName: string, onJobInQueue: any){
return new Worker(queueName, onJobInQueue, { connection: {
host: RedisHostname.toString(),
port: RedisPort.toNumber()
}});
}
}

View File

@@ -1,10 +1,48 @@
import PostgresDatabase from '../Infrastructure/PostgresDatabase';
import Model from 'Model/Models/Workflow';
import DatabaseService from './DatabaseService';
import DatabaseService, { OnUpdate } from './DatabaseService';
import ObjectID from 'Common/Types/ObjectID';
import { JSONObject } from 'Common/Types/JSON';
import { ComponentType, NodeDataProp, NodeType } from "Common/Types/Workflow/Component";
export class Service extends DatabaseService<Model> {
public constructor(postgresDatabase?: PostgresDatabase) {
super(Model, postgresDatabase);
}
protected override async onUpdateSuccess(onUpdate: OnUpdate<Model>, _updatedItemIds: ObjectID[]): Promise<OnUpdate<Model>> {
/// save trigger and trigger args.
let trigger: NodeDataProp | null = null;
if (onUpdate.updateBy.data && (onUpdate.updateBy.data as any).graph && ((onUpdate.updateBy.data as any).graph as any)['nodes'] as Array<JSONObject>) {
// check if it has a trigger node.
for (const node of ((onUpdate.updateBy.data as any).graph as any)['nodes'] as Array<JSONObject>) {
const nodeData = node["data"] as NodeDataProp;
if(nodeData.componentType === ComponentType.Trigger && nodeData.nodeType === NodeType.Node){
// found the trigger;
trigger = nodeData;
}
}
}
await this.updateOneById({
id: new ObjectID(onUpdate.updateBy.query._id! as any),
data: {
triggerId: trigger?.metadataId!,
triggerArguments: trigger?.arguments || {}
} as any,
props: {
isRoot: true,
ignoreHooks: true,
}
});
return onUpdate;
}
}
export default new Service();

View File

@@ -17,6 +17,7 @@
"@types/gridfs-stream": "^0.5.35",
"@types/json2csv": "^5.0.3",
"airtable": "^0.11.3",
"bullmq": "^3.6.6",
"Common": "file:../Common",
"cors": "^2.8.5",
"dotenv": "^16.0.0",
@@ -1891,6 +1892,11 @@
"@hapi/topo": "^5.0.0"
}
},
"node_modules/@ioredis/commands": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz",
"integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg=="
},
"node_modules/@istanbuljs/load-nyc-config": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
@@ -2203,6 +2209,78 @@
"@jridgewell/sourcemap-codec": "1.4.14"
}
},
"node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.0.tgz",
"integrity": "sha512-5qpnNHUyyEj9H3sm/4Um/bnx1lrQGhe8iqry/1d+cQYCRd/gzYA0YLeq0ezlk4hKx4vO+dsEsNyeowqRqslwQA==",
"cpu": [
"arm64"
],
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.0.tgz",
"integrity": "sha512-ZphTFFd6SFweNAMKD+QJCrWpgkjf4qBuHltiMkKkD6FFrB3NOTRVmetAGTkJ57pa+s6J0yCH06LujWB9rZe94g==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.0.tgz",
"integrity": "sha512-ztKVV1dO/sSZyGse0PBCq3Pk1PkYjsA/dsEWE7lfrGoAK3i9HpS2o7XjGQ7V4va6nX+xPPOiuYpQwa4Bi6vlww==",
"cpu": [
"arm"
],
"optional": true,
"os": [
"linux"
]
},
"node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.0.tgz",
"integrity": "sha512-NEX6hdSvP4BmVyegaIbrGxvHzHvTzzsPaxXCsUt0mbLbPpEftsvNwaEVKOowXnLoeuGeD4MaqSwL3BUK2elsUA==",
"cpu": [
"arm64"
],
"optional": true,
"os": [
"linux"
]
},
"node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.0.tgz",
"integrity": "sha512-9uvdAkZMOPCY7SPRxZLW8XGqBOVNVEhqlgffenN8shA1XR9FWVsSM13nr/oHtNgXg6iVyML7RwWPyqUeThlwxg==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"linux"
]
},
"node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.0.tgz",
"integrity": "sha512-Wg0+9615kHKlr9iLVcG5I+/CHnf6w3x5UADRv8Ad16yA0Bu5l9eVOROjV7aHPG6uC8ZPFIVVaoSjDChD+Y0pzg==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"win32"
]
},
"node_modules/@opentelemetry/api": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.1.0.tgz",
@@ -4359,6 +4437,66 @@
"node": ">=4"
}
},
"node_modules/bullmq": {
"version": "3.6.6",
"resolved": "https://registry.npmjs.org/bullmq/-/bullmq-3.6.6.tgz",
"integrity": "sha512-W71jXrcTdcT3Y5tzMyTx22Cd8O3dTML7vl6KG3YdGVGrO3+UmKRLYfGLn1QwIhIoTQJVvIrSB4qfGs1hgqYRVw==",
"dependencies": {
"cron-parser": "^4.6.0",
"glob": "^8.0.3",
"ioredis": "^5.3.0",
"lodash": "^4.17.21",
"msgpackr": "^1.6.2",
"semver": "^7.3.7",
"tslib": "^2.0.0",
"uuid": "^9.0.0"
}
},
"node_modules/bullmq/node_modules/brace-expansion": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/bullmq/node_modules/glob": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
"integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^5.0.1",
"once": "^1.3.0"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/bullmq/node_modules/minimatch": {
"version": "5.1.6",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
"integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/bullmq/node_modules/uuid": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
"integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==",
"bin": {
"uuid": "dist/bin/uuid"
}
},
"node_modules/busboy": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
@@ -4664,6 +4802,17 @@
"node": ">= 0.10"
}
},
"node_modules/cron-parser": {
"version": "4.7.1",
"resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.7.1.tgz",
"integrity": "sha512-WguFaoQ0hQ61SgsCZLHUcNbAvlK0lypKXu62ARguefYmjzaOXIVRNrAmyXzabTwUn4sQvQLkk6bjH+ipGfw8bA==",
"dependencies": {
"luxon": "^3.2.1"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -5878,6 +6027,37 @@
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/ioredis": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.3.1.tgz",
"integrity": "sha512-C+IBcMysM6v52pTLItYMeV4Hz7uriGtoJdz7SSBDX6u+zwSYGirLdQh3L7t/OItWITcw3gTFMjJReYUwS4zihg==",
"dependencies": {
"@ioredis/commands": "^1.1.1",
"cluster-key-slot": "^1.1.0",
"debug": "^4.3.4",
"denque": "^2.1.0",
"lodash.defaults": "^4.2.0",
"lodash.isarguments": "^3.1.0",
"redis-errors": "^1.2.0",
"redis-parser": "^3.0.0",
"standard-as-callback": "^2.1.0"
},
"engines": {
"node": ">=12.22.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/ioredis"
}
},
"node_modules/ioredis/node_modules/denque": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
"integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
"engines": {
"node": ">=0.10"
}
},
"node_modules/ip": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
@@ -6982,11 +7162,21 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"node_modules/lodash.defaults": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
"integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="
},
"node_modules/lodash.get": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
"integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="
},
"node_modules/lodash.isarguments": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
"integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg=="
},
"node_modules/lodash.memoize": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
@@ -7021,6 +7211,14 @@
"node": ">=10"
}
},
"node_modules/luxon": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.2.1.tgz",
"integrity": "sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg==",
"engines": {
"node": ">=12"
}
},
"node_modules/make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
@@ -7279,6 +7477,35 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"node_modules/msgpackr": {
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.8.3.tgz",
"integrity": "sha512-m2JefwcKNzoHYXkH/5jzHRxAw7XLWsAdvu0FOJ+OLwwozwOV/J6UA62iLkfIMbg7G8+dIuRwgg6oz+QoQ4YkoA==",
"optionalDependencies": {
"msgpackr-extract": "^3.0.0"
}
},
"node_modules/msgpackr-extract": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.0.tgz",
"integrity": "sha512-oy6KCk1+X4Bn5m6Ycq5N1EWl9npqG/cLrE8ga8NX7ZqfqYUUBS08beCQaGq80fjbKBySur0E6x//yZjzNJDt3A==",
"hasInstallScript": true,
"optional": true,
"dependencies": {
"node-gyp-build-optional-packages": "5.0.7"
},
"bin": {
"download-msgpackr-prebuilds": "bin/download-prebuilds.js"
},
"optionalDependencies": {
"@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.0",
"@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.0",
"@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.0",
"@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.0",
"@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.0",
"@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.0"
}
},
"node_modules/mz": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
@@ -7374,6 +7601,17 @@
"webidl-conversions": "^3.0.0"
}
},
"node_modules/node-gyp-build-optional-packages": {
"version": "5.0.7",
"resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz",
"integrity": "sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==",
"optional": true,
"bin": {
"node-gyp-build-optional-packages": "bin.js",
"node-gyp-build-optional-packages-optional": "optional.js",
"node-gyp-build-optional-packages-test": "build-test.js"
}
},
"node_modules/node-int64": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
@@ -8041,6 +8279,25 @@
"@redis/time-series": "1.0.4"
}
},
"node_modules/redis-errors": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
"integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==",
"engines": {
"node": ">=4"
}
},
"node_modules/redis-parser": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz",
"integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==",
"dependencies": {
"redis-errors": "^1.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/reflect-metadata": {
"version": "0.1.13",
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz",
@@ -8541,6 +8798,11 @@
"node": ">=10"
}
},
"node_modules/standard-as-callback": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz",
"integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A=="
},
"node_modules/statuses": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
@@ -11090,6 +11352,11 @@
"@hapi/topo": "^5.0.0"
}
},
"@ioredis/commands": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz",
"integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg=="
},
"@istanbuljs/load-nyc-config": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
@@ -11338,6 +11605,42 @@
"@jridgewell/sourcemap-codec": "1.4.14"
}
},
"@msgpackr-extract/msgpackr-extract-darwin-arm64": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.0.tgz",
"integrity": "sha512-5qpnNHUyyEj9H3sm/4Um/bnx1lrQGhe8iqry/1d+cQYCRd/gzYA0YLeq0ezlk4hKx4vO+dsEsNyeowqRqslwQA==",
"optional": true
},
"@msgpackr-extract/msgpackr-extract-darwin-x64": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.0.tgz",
"integrity": "sha512-ZphTFFd6SFweNAMKD+QJCrWpgkjf4qBuHltiMkKkD6FFrB3NOTRVmetAGTkJ57pa+s6J0yCH06LujWB9rZe94g==",
"optional": true
},
"@msgpackr-extract/msgpackr-extract-linux-arm": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.0.tgz",
"integrity": "sha512-ztKVV1dO/sSZyGse0PBCq3Pk1PkYjsA/dsEWE7lfrGoAK3i9HpS2o7XjGQ7V4va6nX+xPPOiuYpQwa4Bi6vlww==",
"optional": true
},
"@msgpackr-extract/msgpackr-extract-linux-arm64": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.0.tgz",
"integrity": "sha512-NEX6hdSvP4BmVyegaIbrGxvHzHvTzzsPaxXCsUt0mbLbPpEftsvNwaEVKOowXnLoeuGeD4MaqSwL3BUK2elsUA==",
"optional": true
},
"@msgpackr-extract/msgpackr-extract-linux-x64": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.0.tgz",
"integrity": "sha512-9uvdAkZMOPCY7SPRxZLW8XGqBOVNVEhqlgffenN8shA1XR9FWVsSM13nr/oHtNgXg6iVyML7RwWPyqUeThlwxg==",
"optional": true
},
"@msgpackr-extract/msgpackr-extract-win32-x64": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.0.tgz",
"integrity": "sha512-Wg0+9615kHKlr9iLVcG5I+/CHnf6w3x5UADRv8Ad16yA0Bu5l9eVOROjV7aHPG6uC8ZPFIVVaoSjDChD+Y0pzg==",
"optional": true
},
"@opentelemetry/api": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.1.0.tgz",
@@ -12999,6 +13302,56 @@
"resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
"integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw=="
},
"bullmq": {
"version": "3.6.6",
"resolved": "https://registry.npmjs.org/bullmq/-/bullmq-3.6.6.tgz",
"integrity": "sha512-W71jXrcTdcT3Y5tzMyTx22Cd8O3dTML7vl6KG3YdGVGrO3+UmKRLYfGLn1QwIhIoTQJVvIrSB4qfGs1hgqYRVw==",
"requires": {
"cron-parser": "^4.6.0",
"glob": "^8.0.3",
"ioredis": "^5.3.0",
"lodash": "^4.17.21",
"msgpackr": "^1.6.2",
"semver": "^7.3.7",
"tslib": "^2.0.0",
"uuid": "^9.0.0"
},
"dependencies": {
"brace-expansion": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"requires": {
"balanced-match": "^1.0.0"
}
},
"glob": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
"integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^5.0.1",
"once": "^1.3.0"
}
},
"minimatch": {
"version": "5.1.6",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
"integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
"requires": {
"brace-expansion": "^2.0.1"
}
},
"uuid": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
"integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg=="
}
}
},
"busboy": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
@@ -13257,6 +13610,14 @@
"vary": "^1"
}
},
"cron-parser": {
"version": "4.7.1",
"resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.7.1.tgz",
"integrity": "sha512-WguFaoQ0hQ61SgsCZLHUcNbAvlK0lypKXu62ARguefYmjzaOXIVRNrAmyXzabTwUn4sQvQLkk6bjH+ipGfw8bA==",
"requires": {
"luxon": "^3.2.1"
}
},
"cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -14182,6 +14543,29 @@
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"ioredis": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.3.1.tgz",
"integrity": "sha512-C+IBcMysM6v52pTLItYMeV4Hz7uriGtoJdz7SSBDX6u+zwSYGirLdQh3L7t/OItWITcw3gTFMjJReYUwS4zihg==",
"requires": {
"@ioredis/commands": "^1.1.1",
"cluster-key-slot": "^1.1.0",
"debug": "^4.3.4",
"denque": "^2.1.0",
"lodash.defaults": "^4.2.0",
"lodash.isarguments": "^3.1.0",
"redis-errors": "^1.2.0",
"redis-parser": "^3.0.0",
"standard-as-callback": "^2.1.0"
},
"dependencies": {
"denque": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
"integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="
}
}
},
"ip": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
@@ -15048,11 +15432,21 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"lodash.defaults": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
"integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="
},
"lodash.get": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
"integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="
},
"lodash.isarguments": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
"integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg=="
},
"lodash.memoize": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
@@ -15084,6 +15478,11 @@
"yallist": "^4.0.0"
}
},
"luxon": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.2.1.tgz",
"integrity": "sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg=="
},
"make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
@@ -15273,6 +15672,29 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"msgpackr": {
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.8.3.tgz",
"integrity": "sha512-m2JefwcKNzoHYXkH/5jzHRxAw7XLWsAdvu0FOJ+OLwwozwOV/J6UA62iLkfIMbg7G8+dIuRwgg6oz+QoQ4YkoA==",
"requires": {
"msgpackr-extract": "^3.0.0"
}
},
"msgpackr-extract": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.0.tgz",
"integrity": "sha512-oy6KCk1+X4Bn5m6Ycq5N1EWl9npqG/cLrE8ga8NX7ZqfqYUUBS08beCQaGq80fjbKBySur0E6x//yZjzNJDt3A==",
"optional": true,
"requires": {
"@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.0",
"@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.0",
"@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.0",
"@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.0",
"@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.0",
"@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.0",
"node-gyp-build-optional-packages": "5.0.7"
}
},
"mz": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
@@ -15351,6 +15773,12 @@
}
}
},
"node-gyp-build-optional-packages": {
"version": "5.0.7",
"resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz",
"integrity": "sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==",
"optional": true
},
"node-int64": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
@@ -15860,6 +16288,19 @@
"@redis/time-series": "1.0.4"
}
},
"redis-errors": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
"integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w=="
},
"redis-parser": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz",
"integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==",
"requires": {
"redis-errors": "^1.0.0"
}
},
"reflect-metadata": {
"version": "0.1.13",
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz",
@@ -16250,6 +16691,11 @@
"escape-string-regexp": "^2.0.0"
}
},
"standard-as-callback": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz",
"integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A=="
},
"statuses": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",

View File

@@ -19,6 +19,7 @@
"@types/gridfs-stream": "^0.5.35",
"@types/json2csv": "^5.0.3",
"airtable": "^0.11.3",
"bullmq": "^3.6.6",
"Common": "file:../Common",
"cors": "^2.8.5",
"dotenv": "^16.0.0",

View File

@@ -5,11 +5,10 @@ import React, {
useRef,
useState,
} from 'react';
import { Argument } from 'Common/Types/Workflow/Component';
import { Argument, NodeDataProp } from 'Common/Types/Workflow/Component';
import ErrorMessage from '../ErrorMessage/ErrorMessage';
import BasicForm from '../Forms/BasicForm';
import FormValues from '../Forms/Types/FormValues';
import { NodeDataProp } from './Component';
import { JSONObject } from 'Common/Types/JSON';
import Dictionary from 'Common/Types/Dictionary';
import { componentInputTypeToFormFieldType } from './Utils';

View File

@@ -1,33 +1,19 @@
import { JSONObject } from 'Common/Types/JSON';
import React, { FunctionComponent, useState } from 'react';
import { Handle, Position, Connection } from 'reactflow';
import Icon, { ThickProp } from '../Icon/Icon';
import IconProp from 'Common/Types/Icon/IconProp';
import ComponentMetadata, {
import {
ComponentType,
NodeDataProp,
NodeType,
Port,
} from 'Common/Types/Workflow/Component';
import Tooltip from '../Tooltip/Toolip';
import Pill from '../Pill/Pill';
import { Green } from 'Common/Types/BrandColors';
export enum NodeType {
Node = 'Node',
PlaceholderNode = 'PlaceholderNode',
}
export interface NodeDataProp {
error: string;
id: string;
nodeType: NodeType;
onClick?: (node: NodeDataProp) => void | undefined;
isPreview?: boolean | undefined; // is this used to show in the components modal?
metadata: ComponentMetadata;
metadataId: string;
internalId: string;
arguments: JSONObject;
returnValues: JSONObject;
}
export interface ComponentProps {
data: NodeDataProp;

View File

@@ -9,9 +9,9 @@ import React, {
import ComponentMetadata, {
ComponentType,
ComponentCategory,
NodeType
} from 'Common/Types/Workflow/Component';
import ComponentElement, { NodeType } from './Component';
import ComponentElement from './Component';
import Input from '../Input/Input';
import ErrorMessage from '../ErrorMessage/ErrorMessage';
import Icon from '../Icon/Icon';
@@ -201,6 +201,7 @@ const ComponentsModal: FunctionComponent<ComponentProps> = (
'',
nodeType:
NodeType.Node,
componentType:componentMetadata.componentType,
returnValues:
{},
isPreview:

View File

@@ -9,11 +9,11 @@ import FormFieldSchemaType from '../Forms/Types/FormFieldSchemaType';
import FormValues from '../Forms/Types/FormValues';
import ConfirmModal from '../Modal/ConfirmModal';
import SideOver from '../SideOver/SideOver';
import { NodeDataProp } from './Component';
import ComponentPortViewer from './ComponentPortViewer';
import ComponentReturnValueViewer from './ComponentReturnValueViewer';
import ArgumentsForm from './ArgumentsForm';
import ObjectID from 'Common/Types/ObjectID';
import { NodeDataProp } from 'Common/Types/Workflow/Component';
export interface ComponentProps {
title: string;

View File

@@ -1,10 +1,9 @@
import { Black } from 'Common/Types/BrandColors';
import { ReturnValue } from 'Common/Types/Workflow/Component';
import { NodeDataProp, ReturnValue } from 'Common/Types/Workflow/Component';
import React, { useState, FunctionComponent, ReactElement } from 'react';
import ErrorMessage from '../ErrorMessage/ErrorMessage';
import Modal, { ModalWidth } from '../Modal/Modal';
import Pill from '../Pill/Pill';
import { NodeDataProp } from './Component';
export interface ComponentProps {
onClose: () => void;

View File

@@ -5,11 +5,10 @@ import React, {
useRef,
useState,
} from 'react';
import { ReturnValue } from 'Common/Types/Workflow/Component';
import { NodeDataProp, ReturnValue } from 'Common/Types/Workflow/Component';
import ErrorMessage from '../ErrorMessage/ErrorMessage';
import BasicForm from '../Forms/BasicForm';
import FormValues from '../Forms/Types/FormValues';
import { NodeDataProp } from './Component';
import { JSONObject } from 'Common/Types/JSON';
import Dictionary from 'Common/Types/Dictionary';
import { componentInputTypeToFormFieldType } from './Utils';

View File

@@ -1,10 +1,10 @@
import Dictionary from 'Common/Types/Dictionary';
import { NodeDataProp, NodeType } from 'Common/Types/Workflow/Component';
import React, { FunctionComponent, ReactElement, useState } from 'react';
import { ButtonStyleType } from '../Button/Button';
import ErrorMessage from '../ErrorMessage/ErrorMessage';
import ConfirmModal from '../Modal/ConfirmModal';
import SideOver from '../SideOver/SideOver';
import { NodeDataProp, NodeType } from './Component';
import RunForm from './RunForm';
export interface ComponentProps {

View File

@@ -24,12 +24,13 @@ import ReactFlow, {
} from 'reactflow';
// 👇 you need to import the reactflow styles
import 'reactflow/dist/style.css';
import WorkflowComponent, { NodeDataProp, NodeType } from './Component';
import WorkflowComponent from './Component';
import ObjectID from 'Common/Types/ObjectID';
import IconProp from 'Common/Types/Icon/IconProp';
import ComponentMetadata, {
ComponentCategory,
ComponentType,
NodeDataProp, NodeType
} from 'Common/Types/Workflow/Component';
import ComponentsModal from './ComponentModal';
import { JSONObject } from 'Common/Types/JSON';
@@ -165,7 +166,7 @@ const Workflow: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
return node.data.id !== id;
});
if (nodeToUpdate.length === 0) {
if (nodeToUpdate.filter((n: Node)=> (n.data as NodeDataProp).componentType === ComponentType.Trigger && (n.data as NodeDataProp).nodeType === NodeType.Node).length === 0) {
nodeToUpdate = nodeToUpdate.concat(getPlaceholderTriggerNode());
}
@@ -311,7 +312,8 @@ const Workflow: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
metadata: { ...componentMetadata },
metadataId: componentMetadata.id,
internalId: ObjectID.generate().toString(), // runner id
},
componentType: componentMetadata.componentType
} as NodeDataProp,
};
if (componentMetadata.componentType === ComponentType.Trigger) {

View File

@@ -31,10 +31,7 @@ import ComponentMetadata, {
ComponentCategory,
} from 'Common/Types/Workflow/Component';
import BadDataException from 'Common/Types/Exception/BadDataException';
import {
NodeDataProp,
NodeType,
} from 'CommonUI/src/Components/Workflow/Component';
import { NodeDataProp, NodeType } from 'Common/Types/Workflow/Component';
const Delete: FunctionComponent<PageComponentProps> = (
_props: PageComponentProps

View File

@@ -398,4 +398,45 @@ export default class Workflow extends BaseModel {
},
})
public labels?: Array<Label> = undefined;
@ColumnAccessControl({
create: [
],
read: [
],
update: [
],
})
@TableColumn({ isDefaultValueColumn: false, required: false, type: TableColumnType.ShortText })
@Column({
type: ColumnType.ShortText,
nullable: true,
length:ColumnLength.ShortText
})
public triggerId?: string = undefined;
@ColumnAccessControl({
create: [
],
read: [
],
update: [
],
})
@TableColumn({ isDefaultValueColumn: false, required: false, type: TableColumnType.JSON })
@Column({
type: ColumnType.JSON,
nullable: true,
})
public triggerArguments?: JSONObject = undefined;
}

View File

@@ -0,0 +1,2 @@
maxmemory-policy=noeviction
appendonly yes

97
Workflow/API/Trigger.ts Normal file
View File

@@ -0,0 +1,97 @@
import Express, {
ExpressRequest,
ExpressResponse,
ExpressRouter,
} from 'CommonServer/Utils/Express';
import Response from 'CommonServer/Utils/Response';
import ObjectID from "Common/Types/ObjectID";
import BadDataException from 'Common/Types/Exception/BadDataException';
import WorkflowService from "CommonServer/Services/WorkflowService";
import WorkflowLogService from "CommonServer/Services/WorkflowLogService";
import Workflow from "Model/Models/Workflow";
import WorkflowLog from 'Model/Models/WorkflowLog';
import WorkflowStatus from 'Common/Types/Workflow/WorkflowStatus';
import OneUptimeDate from 'Common/Types/Date';
import Queue, { QueueName } from 'CommonServer/Infrastructure/Queue';
export default class RunAPI {
public router!: ExpressRouter;
public constructor() {
this.router = Express.getRouter();
this.router.get(
`/manual/:workflowId`,
this.manuallyRunWorkflow
);
this.router.post(
`/manual/:workflowId`,
this.manuallyRunWorkflow
);
}
public async manuallyRunWorkflow(
req: ExpressRequest,
res: ExpressResponse,
) {
// add this workflow to the run queue and return the 200 response.
if (!req.params["workflowId"]) {
return Response.sendErrorResponse(req, res, new BadDataException("workflowId not found in URL"))
}
const workflowId = new ObjectID(req.params["workflowId"]);
// get workflow to see if its enabled.
const workflow: Workflow | null = await WorkflowService.findOneById({
id: workflowId,
select: {
isEnabled: true,
projectId: true
},
props: {
isRoot: true,
}
});
if (!workflow) {
return Response.sendErrorResponse(req, res, new BadDataException("Workflow not found"))
}
if (!workflow.isEnabled) {
return Response.sendErrorResponse(req, res, new BadDataException("This workflow is not enabled"))
}
if (!workflow.projectId) {
return Response.sendErrorResponse(req, res, new BadDataException("This workflow does not belong to a project and cannot be run"))
}
// Add Workflow Run Log.
const runLog = new WorkflowLog();
runLog.workflowId = workflowId;
runLog.projectId = workflow.projectId;
runLog.workflowStatus = WorkflowStatus.Scheduled;
runLog.logs = OneUptimeDate.getCurrentDateAsFormattedString() + ": Workflow Scheduled.";
const created = await WorkflowLogService.create({
data: runLog,
props: {
isRoot: true
}
});
await Queue.addJob(QueueName.Workflow, ObjectID.generate(), workflow._id?.toString() || '', {
data: req.body,
workflowLogId: created._id,
workflowId: workflow._id
});
return Response.sendJsonObjectResponse(req, res, { status: "Scheduled" });
}
}

View File

@@ -3,11 +3,15 @@ import App from 'CommonServer/Utils/StartServer';
import { PostgresAppInstance } from 'CommonServer/Infrastructure/PostgresDatabase';
import Redis from 'CommonServer/Infrastructure/Redis';
import logger from 'CommonServer/Utils/Logger';
import RunAPI from './API/Trigger';
const APP_NAME: string = 'workflow';
const app: ExpressApplication = Express.getExpressApp();
app.use(`/run`, new RunAPI().router);
const init: Function = async (): Promise<void> => {
try {
// init the app
@@ -19,6 +23,7 @@ const init: Function = async (): Promise<void> => {
// connect redis
await Redis.connect();
} catch (err) {
logger.error('App Init Failed:');
logger.error(err);