@5minds/node-red-contrib-processcube 1.3.0-feature-194a21-m24lts6l → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@5minds/node-red-contrib-processcube",
3
- "version": "1.3.0-feature-194a21-m24lts6l",
3
+ "version": "1.3.0",
4
4
  "license": "MIT",
5
5
  "description": "Node-RED nodes for ProcessCube",
6
6
  "scripts": {
@@ -45,12 +45,11 @@
45
45
  "processEventListener": "process-event-listener.js",
46
46
  "processcubeEngineConfig": "processcube-engine-config.js",
47
47
  "ProcessinstanceQuery": "processinstance-query.js",
48
+ "ProcessinstanceDelete": "processinstance-delete.js",
48
49
  "ProcessdefinitionQuery": "processdefinition-query.js",
49
50
  "messageEventTrigger": "message-event-trigger.js",
50
51
  "signalEventTrigger": "signal-event-trigger.js",
51
52
  "userTaskEventListener": "usertask-event-listener.js",
52
- "UserTaskNewListener": "usertask-new-listener.js",
53
- "UserTaskFinishedListener": "usertask-finished-listener.js",
54
53
  "UserTaskInput": "usertask-input.js",
55
54
  "UserTaskOutput": "usertask-output.js",
56
55
  "WaitForUsertask": "wait-for-usertask.js"
@@ -0,0 +1,58 @@
1
+ <script type="text/javascript">
2
+ RED.nodes.registerType('processinstance-delete', {
3
+ category: 'ProcessCube DevOps',
4
+ color: '#02AFD6',
5
+ defaults: {
6
+ name: { value: '' },
7
+ engine: { value: '', type: 'processcube-engine-config' },
8
+ time: { value: '', type: 'number' },
9
+ time_type: { value: 'hours' },
10
+ },
11
+ inputs: 1,
12
+ outputs: 1,
13
+ icon: 'font-awesome/fa-sign-in',
14
+ label: function () {
15
+ return this.name || 'processinstance-delete';
16
+ },
17
+ });
18
+ </script>
19
+
20
+ <script type="text/html" data-template-name="processinstance-delete">
21
+ <div class="form-row">
22
+ <label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
23
+ <input type="text" id="node-input-name" placeholder="Name" />
24
+ </div>
25
+ <div class="form-row">
26
+ <label for="node-input-engine"><i class="fa fa-tag"></i> Engine-URL</label>
27
+ <input type="text" id="node-input-engine" placeholder="Engine-URL" />
28
+ </div>
29
+ <div class="form-row">
30
+ <label for="node-input-time"><i class="fa fa-tag"></i> Time</label>
31
+ <input type="text" id="node-input-time" />
32
+ </div>
33
+ <div class="form-row">
34
+ <label for="node-input-time_type"><i class="fa fa-sliders"></i> Period</label>
35
+ <select id="node-input-time_type" style="width: 70%;">
36
+ <option value="hours">Hours</option>
37
+ <option value="days">Days</option>
38
+ </select>
39
+ </div>
40
+ </script>
41
+
42
+ <script type="text/markdown" data-help-name="processinstance-delete">
43
+ Delete old instances of a process model in the ProcessCube.
44
+
45
+ ## Inputs
46
+
47
+ : payload.time (number): The number of given time periods.
48
+ : payload.time_type ('hours' | 'days'): The type of time period to use.
49
+
50
+ ## Outputs
51
+
52
+ : payload (string[]): The ids of the processinstances that were deleted.
53
+
54
+ ### References
55
+
56
+ - [The ProcessCube Developer Network](https://processcube.io) - All documentation for the ProcessCube&copy; platform
57
+ - [Node-RED Integration in ProcessCube&copy;](https://processcube.io/docs/node-red) - Node-RED integration in ProcessCube&copy;
58
+ </script>
@@ -0,0 +1,55 @@
1
+ module.exports = function (RED) {
2
+ function ProcessInstanceDelete(config) {
3
+ RED.nodes.createNode(this, config);
4
+ var node = this;
5
+
6
+ node.on('input', async function (msg) {
7
+ const engine = RED.nodes.getNode(config.engine);
8
+ const client = engine.engineClient;
9
+
10
+ if (!client) {
11
+ node.error('No engine configured.');
12
+ return;
13
+ }
14
+ let timeMultiplier;
15
+ if (msg.payload.time_type) {
16
+ timeMultiplier = msg.payload.time_type == 'hours' ? 1 : 24;
17
+ } else {
18
+ timeMultiplier = config.time_type == 'hours' ? 1 : 24;
19
+ }
20
+
21
+ const timeToUse = msg.payload.time ? msg.payload.time : config.time;
22
+
23
+ try {
24
+ const fetchInstancesByState = async (state) => {
25
+ const result = await client.processInstances.query({ state });
26
+ return result.processInstances;
27
+ };
28
+
29
+ const finishedInstances = await fetchInstancesByState('finished');
30
+ const terminatedInstances = await fetchInstancesByState('terminated');
31
+ const errorInstances = await fetchInstancesByState('error');
32
+
33
+ let allInstances = [...finishedInstances, ...terminatedInstances, ...errorInstances];
34
+
35
+ const today = new Date();
36
+
37
+ const oldTasks = allInstances.filter((instance) => {
38
+ const finishedDate = new Date(instance.finishedAt);
39
+ const diffInHours = (today - finishedDate) / (1000 * 60 * 60);
40
+ return diffInHours > Number(timeToUse) * timeMultiplier;
41
+ });
42
+
43
+ const ids = oldTasks.map((obj) => obj.processInstanceId);
44
+ msg.payload = ids;
45
+
46
+ await client.processInstances.deleteProcessInstances(ids, true, engine.identity);
47
+ node.send(msg);
48
+ } catch (error) {
49
+ node.error(error);
50
+ }
51
+ });
52
+ }
53
+
54
+ RED.nodes.registerType('processinstance-delete', ProcessInstanceDelete);
55
+ };