@red-hat-developer-hub/backstage-plugin-orchestrator-backend 8.7.2 → 8.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +53 -0
- package/dist/helpers/filterBuilder.cjs.js +83 -15
- package/dist/helpers/filterBuilder.cjs.js.map +1 -1
- package/dist/helpers/queryBuilder.cjs.js +38 -20
- package/dist/helpers/queryBuilder.cjs.js.map +1 -1
- package/dist/service/DataIndexService.cjs.js +90 -23
- package/dist/service/DataIndexService.cjs.js.map +1 -1
- package/dist/service/DevModeService.cjs.js +1 -0
- package/dist/service/DevModeService.cjs.js.map +1 -1
- package/dist/service/GitWrapper/git.cjs.js +1 -0
- package/dist/service/GitWrapper/git.cjs.js.map +1 -1
- package/dist/service/OrchestratorService.cjs.js +4 -0
- package/dist/service/OrchestratorService.cjs.js.map +1 -1
- package/dist/service/SonataFlowService.cjs.js +2 -0
- package/dist/service/SonataFlowService.cjs.js.map +1 -1
- package/dist/service/WorkflowCacheService.cjs.js +3 -0
- package/dist/service/WorkflowCacheService.cjs.js.map +1 -1
- package/dist/service/api/v2.cjs.js +1 -0
- package/dist/service/api/v2.cjs.js.map +1 -1
- package/dist/types/pagination.cjs.js.map +1 -1
- package/package.json +16 -16
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# @red-hat-developer-hub/backstage-plugin-orchestrator-backend
|
|
2
2
|
|
|
3
|
+
## 8.8.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 2212e8d: Backstage version bump to v1.49.3
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [665a75c]
|
|
12
|
+
- Updated dependencies [2212e8d]
|
|
13
|
+
- @red-hat-developer-hub/backstage-plugin-orchestrator-common@3.6.0
|
|
14
|
+
- @red-hat-developer-hub/backstage-plugin-orchestrator-node@1.2.0
|
|
15
|
+
|
|
16
|
+
## 8.7.3
|
|
17
|
+
|
|
18
|
+
### Patch Changes
|
|
19
|
+
|
|
20
|
+
- 91013e2: - Update dependecy @urql/core to fix CVE-2026-3118
|
|
21
|
+
- Reworks the filter and query builder code to use query variables
|
|
22
|
+
- Updated dependencies [5a9d9d8]
|
|
23
|
+
- @red-hat-developer-hub/backstage-plugin-orchestrator-common@3.5.3
|
|
24
|
+
- @red-hat-developer-hub/backstage-plugin-orchestrator-node@1.1.3
|
|
25
|
+
|
|
3
26
|
## 8.7.2
|
|
4
27
|
|
|
5
28
|
### Patch Changes
|
|
@@ -31,6 +54,29 @@
|
|
|
31
54
|
- @red-hat-developer-hub/backstage-plugin-orchestrator-common@3.5.0
|
|
32
55
|
- @red-hat-developer-hub/backstage-plugin-orchestrator-node@1.1.0
|
|
33
56
|
|
|
57
|
+
## 8.6.4
|
|
58
|
+
|
|
59
|
+
### Patch Changes
|
|
60
|
+
|
|
61
|
+
- 13159d3: - Update dependecy @urql/core to fix CVE-2026-3118
|
|
62
|
+
- Reworks the filter and query builder code to use query variables
|
|
63
|
+
|
|
64
|
+
## 8.6.3
|
|
65
|
+
|
|
66
|
+
### Patch Changes
|
|
67
|
+
|
|
68
|
+
- Updated dependencies [ea216c7]
|
|
69
|
+
- @red-hat-developer-hub/backstage-plugin-orchestrator-node@1.0.3
|
|
70
|
+
|
|
71
|
+
## 8.6.2
|
|
72
|
+
|
|
73
|
+
### Patch Changes
|
|
74
|
+
|
|
75
|
+
- Updated dependencies [546ccb2]
|
|
76
|
+
- @red-hat-developer-hub/backstage-plugin-orchestrator-common@3.4.2
|
|
77
|
+
- Updated dependencies [02a0552]
|
|
78
|
+
- @red-hat-developer-hub/backstage-plugin-orchestrator-node@1.0.2
|
|
79
|
+
|
|
34
80
|
## 8.6.1
|
|
35
81
|
|
|
36
82
|
### Patch Changes
|
|
@@ -102,6 +148,13 @@
|
|
|
102
148
|
- Updated dependencies [fba1136]
|
|
103
149
|
- @red-hat-developer-hub/backstage-plugin-orchestrator-common@3.2.0
|
|
104
150
|
|
|
151
|
+
## 8.3.1
|
|
152
|
+
|
|
153
|
+
### Patch Changes
|
|
154
|
+
|
|
155
|
+
- 480bde1: - Update dependecy @urql/core to fix CVE-2026-3118
|
|
156
|
+
- Reworks the filter and query builder code to use query variables
|
|
157
|
+
|
|
105
158
|
## 8.3.0
|
|
106
159
|
|
|
107
160
|
### Minor Changes
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var backstagePluginOrchestratorCommon = require('@red-hat-developer-hub/backstage-plugin-orchestrator-common');
|
|
4
|
+
var node_crypto = require('node:crypto');
|
|
4
5
|
|
|
5
6
|
const supportedOperators = [
|
|
6
7
|
backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Eq,
|
|
@@ -42,11 +43,15 @@ function isNestedFilter(filter) {
|
|
|
42
43
|
return filter.nested !== void 0;
|
|
43
44
|
}
|
|
44
45
|
function handleLogicalFilter(introspection, type, filter) {
|
|
45
|
-
if (!filter.operator) return
|
|
46
|
+
if (!filter.operator) return {};
|
|
46
47
|
const subClauses = filter.filters.map(
|
|
47
48
|
(f) => buildFilterCondition(introspection, type, f)
|
|
48
49
|
);
|
|
49
|
-
|
|
50
|
+
const filterClause = {
|
|
51
|
+
clause: `${filter.operator.toLowerCase()}: {${subClauses.map((cl) => cl.clause).join(", ")}}`,
|
|
52
|
+
clauseVariable: subClauses.flatMap((cl) => cl.clauseVariable)
|
|
53
|
+
};
|
|
54
|
+
return filterClause;
|
|
50
55
|
}
|
|
51
56
|
function handleNestedFilter(introspection, type, filter) {
|
|
52
57
|
const subClauses = buildFilterCondition(
|
|
@@ -55,20 +60,54 @@ function handleNestedFilter(introspection, type, filter) {
|
|
|
55
60
|
filter.nested,
|
|
56
61
|
true
|
|
57
62
|
);
|
|
58
|
-
|
|
63
|
+
const filterClause = {
|
|
64
|
+
clauseVariable: subClauses.clauseVariable,
|
|
65
|
+
clause: `${filter.field}: {${subClauses.clause}}`
|
|
66
|
+
};
|
|
67
|
+
return filterClause;
|
|
59
68
|
}
|
|
60
69
|
function handleBetweenOperator(filter) {
|
|
61
70
|
if (!Array.isArray(filter.value) || filter.value.length !== 2) {
|
|
62
71
|
throw new Error("Between operator requires an array of two elements");
|
|
63
72
|
}
|
|
64
|
-
|
|
73
|
+
const filterClauseVariableArray = [];
|
|
74
|
+
const clauseVariableName1 = `clauseVariable${nonSecureRandomAlphaNumeric()}`;
|
|
75
|
+
const filterClauseVariable1 = {
|
|
76
|
+
clauseVariableName: clauseVariableName1,
|
|
77
|
+
formattedValue: filter.value[0],
|
|
78
|
+
clauseVariableType: "String"
|
|
79
|
+
};
|
|
80
|
+
const clauseVariableName2 = `clauseVariable${nonSecureRandomAlphaNumeric()}`;
|
|
81
|
+
const filterClauseVariable2 = {
|
|
82
|
+
clauseVariableName: clauseVariableName2,
|
|
83
|
+
formattedValue: filter.value[1],
|
|
84
|
+
clauseVariableType: "String"
|
|
85
|
+
};
|
|
86
|
+
const clause = `${filter.field}: {${getGraphQLOperator(
|
|
65
87
|
backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Between
|
|
66
|
-
)}: {from:
|
|
88
|
+
)}: {from: $${clauseVariableName1}, to: $${clauseVariableName2}}}`;
|
|
89
|
+
filterClauseVariableArray.push(filterClauseVariable1, filterClauseVariable2);
|
|
90
|
+
const filterClause = {
|
|
91
|
+
clause,
|
|
92
|
+
clauseVariable: filterClauseVariableArray
|
|
93
|
+
};
|
|
94
|
+
return filterClause;
|
|
67
95
|
}
|
|
68
96
|
function handleIsNullOperator(filter) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
97
|
+
const clauseVariableName = `clauseVariable${nonSecureRandomAlphaNumeric()}`;
|
|
98
|
+
const clause = `${filter.field}: {${getGraphQLOperator(backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.IsNull)}: $${clauseVariableName}}`;
|
|
99
|
+
const filterClauseVariable = {
|
|
100
|
+
clauseVariableName,
|
|
101
|
+
formattedValue: convertToBoolean(filter.value),
|
|
102
|
+
clauseVariableType: "Boolean"
|
|
103
|
+
};
|
|
104
|
+
const filterClauseVariableArray = [];
|
|
105
|
+
filterClauseVariableArray.push(filterClauseVariable);
|
|
106
|
+
const clauseObject = {
|
|
107
|
+
clauseVariable: filterClauseVariableArray,
|
|
108
|
+
clause
|
|
109
|
+
};
|
|
110
|
+
return clauseObject;
|
|
72
111
|
}
|
|
73
112
|
function isEnumFilter(fieldName, type) {
|
|
74
113
|
if (type === "ProcessInstance") {
|
|
@@ -89,14 +128,40 @@ function handleBinaryOperator(binaryFilter, fieldDef, type) {
|
|
|
89
128
|
);
|
|
90
129
|
}
|
|
91
130
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
131
|
+
let formattedValue;
|
|
132
|
+
let paramType;
|
|
133
|
+
if (Array.isArray(binaryFilter.value)) {
|
|
134
|
+
formattedValue = binaryFilter.value.map(
|
|
135
|
+
(v) => formatValue(binaryFilter.field, v, fieldDef, type)
|
|
136
|
+
);
|
|
137
|
+
paramType = isEnumFilter(binaryFilter.field, type) ? "[ProcessInstanceState!]" : "[String!]";
|
|
138
|
+
} else {
|
|
139
|
+
formattedValue = formatValue(
|
|
140
|
+
binaryFilter.field,
|
|
141
|
+
binaryFilter.value,
|
|
142
|
+
fieldDef,
|
|
143
|
+
type
|
|
144
|
+
);
|
|
145
|
+
paramType = "String";
|
|
146
|
+
}
|
|
147
|
+
const clauseVariableName = `clauseVariable${nonSecureRandomAlphaNumeric()}`;
|
|
148
|
+
const clause = `${binaryFilter.field}: {${getGraphQLOperator(binaryFilter.operator)}: $${clauseVariableName}}`;
|
|
149
|
+
const filterClauseVariable = {
|
|
150
|
+
clauseVariableName,
|
|
151
|
+
formattedValue,
|
|
152
|
+
clauseVariableType: paramType
|
|
153
|
+
};
|
|
154
|
+
const filterClauseVariableArray = [];
|
|
155
|
+
filterClauseVariableArray.push(filterClauseVariable);
|
|
156
|
+
const clauseObject = {
|
|
157
|
+
clauseVariable: filterClauseVariableArray,
|
|
158
|
+
clause
|
|
159
|
+
};
|
|
160
|
+
return clauseObject;
|
|
96
161
|
}
|
|
97
162
|
function buildFilterCondition(introspection, type, filters, isNested) {
|
|
98
163
|
if (!filters) {
|
|
99
|
-
return
|
|
164
|
+
return {};
|
|
100
165
|
}
|
|
101
166
|
if (isNestedFilter(filters)) {
|
|
102
167
|
return handleNestedFilter(introspection, type, filters);
|
|
@@ -166,7 +231,7 @@ function convertToBoolean(value) {
|
|
|
166
231
|
}
|
|
167
232
|
function formatValue(fieldName, fieldValue, fieldDef, type) {
|
|
168
233
|
if (!fieldDef) {
|
|
169
|
-
return
|
|
234
|
+
return `${fieldValue}`;
|
|
170
235
|
}
|
|
171
236
|
if (!isFieldFilterSupported) {
|
|
172
237
|
throw new Error(`Unsupported field type ${fieldDef.type.name}`);
|
|
@@ -175,7 +240,7 @@ function formatValue(fieldName, fieldValue, fieldDef, type) {
|
|
|
175
240
|
return `${fieldValue}`;
|
|
176
241
|
}
|
|
177
242
|
if (fieldDef.type.name === backstagePluginOrchestratorCommon.TypeName.String || fieldDef.type.name === backstagePluginOrchestratorCommon.TypeName.Id || fieldDef.type.name === backstagePluginOrchestratorCommon.TypeName.Date) {
|
|
178
|
-
return
|
|
243
|
+
return `${fieldValue}`;
|
|
179
244
|
}
|
|
180
245
|
throw new Error(
|
|
181
246
|
`Failed to format value for ${fieldName} ${fieldValue} with type ${fieldDef.type.name}`
|
|
@@ -205,6 +270,9 @@ function getGraphQLOperator(operator) {
|
|
|
205
270
|
throw new Error(`Operation "${operator}" not supported`);
|
|
206
271
|
}
|
|
207
272
|
}
|
|
273
|
+
function nonSecureRandomAlphaNumeric() {
|
|
274
|
+
return node_crypto.randomBytes(8).toString("hex");
|
|
275
|
+
}
|
|
208
276
|
|
|
209
277
|
exports.buildFilterCondition = buildFilterCondition;
|
|
210
278
|
exports.isOperatorAllowedForField = isOperatorAllowedForField;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filterBuilder.cjs.js","sources":["../../src/helpers/filterBuilder.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n FieldFilter,\n FieldFilterOperatorEnum,\n Filter,\n IntrospectionField,\n LogicalFilter,\n NestedFilter,\n TypeName,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\ntype ProcessType = 'ProcessDefinition' | 'ProcessInstance';\n\nconst supportedOperators = [\n FieldFilterOperatorEnum.Eq,\n FieldFilterOperatorEnum.Like,\n FieldFilterOperatorEnum.In,\n FieldFilterOperatorEnum.IsNull,\n FieldFilterOperatorEnum.Gt,\n FieldFilterOperatorEnum.Gte,\n FieldFilterOperatorEnum.Lt,\n FieldFilterOperatorEnum.Lte,\n FieldFilterOperatorEnum.Between,\n];\n\nconst supportedOperatorsByType: Record<TypeName, FieldFilterOperatorEnum[]> = {\n [TypeName.String]: [\n FieldFilterOperatorEnum.In,\n FieldFilterOperatorEnum.Like,\n FieldFilterOperatorEnum.IsNull,\n FieldFilterOperatorEnum.Eq,\n ],\n [TypeName.Id]: [\n FieldFilterOperatorEnum.In,\n FieldFilterOperatorEnum.IsNull,\n FieldFilterOperatorEnum.Eq,\n ],\n [TypeName.Date]: [\n FieldFilterOperatorEnum.IsNull,\n FieldFilterOperatorEnum.Eq,\n FieldFilterOperatorEnum.Gt,\n FieldFilterOperatorEnum.Gte,\n FieldFilterOperatorEnum.Lt,\n FieldFilterOperatorEnum.Lte,\n FieldFilterOperatorEnum.Between,\n ],\n};\n\nfunction isLogicalFilter(filter: Filter): filter is LogicalFilter {\n return (filter as LogicalFilter).filters !== undefined;\n}\n\nfunction isNestedFilter(filter: Filter): filter is NestedFilter {\n return (filter as NestedFilter).nested !== undefined;\n}\n\nfunction handleLogicalFilter(\n introspection: IntrospectionField[],\n type: ProcessType,\n filter: LogicalFilter,\n): string {\n if (!filter.operator) return '';\n\n const subClauses = filter.filters.map(f =>\n buildFilterCondition(introspection, type, f),\n );\n\n return `${filter.operator.toLowerCase()}: {${subClauses.join(', ')}}`;\n}\n\nfunction handleNestedFilter(\n introspection: IntrospectionField[],\n type: ProcessType,\n filter: NestedFilter,\n): string {\n const subClauses = buildFilterCondition(\n introspection,\n type,\n filter.nested,\n true,\n );\n\n return `${filter.field}: {${subClauses}}`;\n}\n\nfunction handleBetweenOperator(filter: FieldFilter): string {\n if (!Array.isArray(filter.value) || filter.value.length !== 2) {\n throw new Error('Between operator requires an array of two elements');\n }\n return `${filter.field}: {${getGraphQLOperator(\n FieldFilterOperatorEnum.Between,\n )}: {from: \"${filter.value[0]}\", to: \"${filter.value[1]}\"}}`;\n}\n\nfunction handleIsNullOperator(filter: FieldFilter): string {\n return `${filter.field}: {${getGraphQLOperator(\n FieldFilterOperatorEnum.IsNull,\n )}: ${convertToBoolean(filter.value)}}`;\n}\n\nfunction isEnumFilter(\n fieldName: string,\n type: 'ProcessDefinition' | 'ProcessInstance',\n): boolean {\n if (type === 'ProcessInstance') {\n if (fieldName === 'state') {\n return true;\n }\n }\n return false;\n}\n\nfunction isValidEnumOperator(operator: FieldFilterOperatorEnum): boolean {\n return (\n operator === FieldFilterOperatorEnum.In ||\n operator === FieldFilterOperatorEnum.Eq\n );\n}\n\nfunction handleBinaryOperator(\n binaryFilter: FieldFilter,\n fieldDef: IntrospectionField | undefined,\n type: 'ProcessDefinition' | 'ProcessInstance',\n): string {\n if (isEnumFilter(binaryFilter.field, type)) {\n if (!isValidEnumOperator(binaryFilter.operator)) {\n throw new Error(\n `Invalid operator ${binaryFilter.operator} for enum field ${binaryFilter.field} filter`,\n );\n }\n }\n const formattedValue = Array.isArray(binaryFilter.value)\n ? `[${binaryFilter.value\n .map(v => formatValue(binaryFilter.field, v, fieldDef, type))\n .join(', ')}]`\n : formatValue(binaryFilter.field, binaryFilter.value, fieldDef, type);\n return `${binaryFilter.field}: {${getGraphQLOperator(\n binaryFilter.operator,\n )}: ${formattedValue}}`;\n}\n\nexport function buildFilterCondition(\n introspection: IntrospectionField[],\n type: ProcessType,\n filters?: Filter,\n isNested?: boolean,\n): string {\n if (!filters) {\n return '';\n }\n\n if (isNestedFilter(filters)) {\n return handleNestedFilter(introspection, type, filters);\n }\n\n if (isLogicalFilter(filters)) {\n return handleLogicalFilter(introspection, type, filters);\n }\n\n if (!isOperatorSupported(filters.operator)) {\n throw new Error(\n `Unsupported operator ${filters.operator}. Supported operators are: ${supportedOperators.join(', ')}`,\n );\n }\n\n let fieldDef;\n\n if (!isNested) {\n fieldDef = introspection.find(f => f.name === filters.field);\n if (!fieldDef) {\n throw new Error(`Can't find field \"${filters.field}\" definition`);\n }\n\n if (!isOperatorAllowedForField(filters.operator, fieldDef, type)) {\n const allowedOperators =\n supportedOperatorsByType[fieldDef.type.name] || [];\n throw new Error(\n `Unsupported operator ${filters.operator} for field \"${fieldDef.name}\" of type \"${fieldDef.type.name}\". Allowed operators are: ${allowedOperators.join(', ')}`,\n );\n }\n }\n\n switch (filters.operator) {\n case FieldFilterOperatorEnum.IsNull:\n return handleIsNullOperator(filters);\n case FieldFilterOperatorEnum.Between:\n return handleBetweenOperator(filters);\n case FieldFilterOperatorEnum.Eq:\n case FieldFilterOperatorEnum.Like:\n case FieldFilterOperatorEnum.In:\n case FieldFilterOperatorEnum.Gt:\n case FieldFilterOperatorEnum.Gte:\n case FieldFilterOperatorEnum.Lt:\n case FieldFilterOperatorEnum.Lte:\n return handleBinaryOperator(filters, fieldDef, type);\n\n default:\n throw new Error(`Can't build filter condition`);\n }\n}\n\nfunction isOperatorSupported(operator: FieldFilterOperatorEnum): boolean {\n return supportedOperators.includes(operator);\n}\n\nfunction isFieldFilterSupported(fieldDef: IntrospectionField): boolean {\n return fieldDef?.type.name === TypeName.String;\n}\n\nexport function isOperatorAllowedForField(\n operator: FieldFilterOperatorEnum,\n fieldDef: IntrospectionField,\n type: ProcessType,\n): boolean {\n if (isEnumFilter(fieldDef.name, type) && isValidEnumOperator(operator)) {\n return true;\n }\n\n const allowedForType = supportedOperatorsByType[fieldDef.type.name];\n return allowedForType ? allowedForType.includes(operator) : false;\n}\n\nfunction convertToBoolean(value: any): boolean {\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'string') {\n return value.toLowerCase() === 'true';\n }\n if (typeof value === 'number') {\n return value === 1;\n }\n return false; // Default to false for unsupported types\n}\n\nfunction formatValue(\n fieldName: string,\n fieldValue: any,\n fieldDef: IntrospectionField | undefined,\n type: ProcessType,\n): string {\n if (!fieldDef) {\n return `\"${fieldValue}\"`;\n }\n\n if (!isFieldFilterSupported) {\n throw new Error(`Unsupported field type ${fieldDef.type.name}`);\n }\n\n if (isEnumFilter(fieldName, type)) {\n return `${fieldValue}`;\n }\n if (\n fieldDef.type.name === TypeName.String ||\n fieldDef.type.name === TypeName.Id ||\n fieldDef.type.name === TypeName.Date\n ) {\n return `\"${fieldValue}\"`;\n }\n throw new Error(\n `Failed to format value for ${fieldName} ${fieldValue} with type ${fieldDef.type.name}`,\n );\n}\n\nfunction getGraphQLOperator(operator: FieldFilterOperatorEnum): string {\n switch (operator) {\n case 'EQ':\n return 'equal';\n case 'LIKE':\n return 'like';\n case 'IN':\n return 'in';\n case 'IS_NULL':\n return 'isNull';\n case 'GT':\n return 'greaterThan';\n case 'GTE':\n return 'greaterThanEqual';\n case 'LT':\n return 'lessThan';\n case 'LTE':\n return 'lessThanEqual';\n case 'BETWEEN':\n return 'between';\n default:\n throw new Error(`Operation \"${operator}\" not supported`);\n }\n}\n"],"names":["FieldFilterOperatorEnum","TypeName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"filterBuilder.cjs.js","sources":["../../src/helpers/filterBuilder.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n FieldFilter,\n FieldFilterOperatorEnum,\n Filter,\n IntrospectionField,\n LogicalFilter,\n NestedFilter,\n TypeName,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { randomBytes } from 'node:crypto';\n\nimport { FilterClause, FilterClauseVariable } from '../types/filterClause';\n\ntype ProcessType = 'ProcessDefinition' | 'ProcessInstance';\n\nconst supportedOperators = [\n FieldFilterOperatorEnum.Eq,\n FieldFilterOperatorEnum.Like,\n FieldFilterOperatorEnum.In,\n FieldFilterOperatorEnum.IsNull,\n FieldFilterOperatorEnum.Gt,\n FieldFilterOperatorEnum.Gte,\n FieldFilterOperatorEnum.Lt,\n FieldFilterOperatorEnum.Lte,\n FieldFilterOperatorEnum.Between,\n];\n\nconst supportedOperatorsByType: Record<TypeName, FieldFilterOperatorEnum[]> = {\n [TypeName.String]: [\n FieldFilterOperatorEnum.In,\n FieldFilterOperatorEnum.Like,\n FieldFilterOperatorEnum.IsNull,\n FieldFilterOperatorEnum.Eq,\n ],\n [TypeName.Id]: [\n FieldFilterOperatorEnum.In,\n FieldFilterOperatorEnum.IsNull,\n FieldFilterOperatorEnum.Eq,\n ],\n [TypeName.Date]: [\n FieldFilterOperatorEnum.IsNull,\n FieldFilterOperatorEnum.Eq,\n FieldFilterOperatorEnum.Gt,\n FieldFilterOperatorEnum.Gte,\n FieldFilterOperatorEnum.Lt,\n FieldFilterOperatorEnum.Lte,\n FieldFilterOperatorEnum.Between,\n ],\n};\n\nfunction isLogicalFilter(filter: Filter): filter is LogicalFilter {\n return (filter as LogicalFilter).filters !== undefined;\n}\n\nfunction isNestedFilter(filter: Filter): filter is NestedFilter {\n return (filter as NestedFilter).nested !== undefined;\n}\n\nfunction handleLogicalFilter(\n introspection: IntrospectionField[],\n type: ProcessType,\n filter: LogicalFilter,\n): FilterClause {\n if (!filter.operator) return {} as FilterClause;\n\n const subClauses = filter.filters.map(f =>\n buildFilterCondition(introspection, type, f),\n );\n\n const filterClause: FilterClause = {\n clause: `${filter.operator.toLowerCase()}: {${subClauses.map(cl => cl.clause).join(', ')}}`,\n clauseVariable: subClauses.flatMap(cl => cl.clauseVariable),\n };\n return filterClause;\n}\n\nfunction handleNestedFilter(\n introspection: IntrospectionField[],\n type: ProcessType,\n filter: NestedFilter,\n): FilterClause {\n const subClauses = buildFilterCondition(\n introspection,\n type,\n filter.nested,\n true,\n );\n\n const filterClause: FilterClause = {\n clauseVariable: subClauses.clauseVariable,\n clause: `${filter.field}: {${subClauses.clause}}`,\n };\n\n return filterClause;\n}\n\nfunction handleBetweenOperator(filter: FieldFilter): FilterClause {\n if (!Array.isArray(filter.value) || filter.value.length !== 2) {\n throw new Error('Between operator requires an array of two elements');\n }\n const filterClauseVariableArray: FilterClauseVariable[] = [];\n const clauseVariableName1 = `clauseVariable${nonSecureRandomAlphaNumeric()}`;\n const filterClauseVariable1: FilterClauseVariable = {\n clauseVariableName: clauseVariableName1,\n formattedValue: filter.value[0],\n clauseVariableType: 'String',\n };\n\n const clauseVariableName2 = `clauseVariable${nonSecureRandomAlphaNumeric()}`;\n const filterClauseVariable2: FilterClauseVariable = {\n clauseVariableName: clauseVariableName2,\n formattedValue: filter.value[1],\n clauseVariableType: 'String',\n };\n\n const clause = `${filter.field}: {${getGraphQLOperator(\n FieldFilterOperatorEnum.Between,\n )}: {from: $${clauseVariableName1}, to: $${clauseVariableName2}}}`;\n filterClauseVariableArray.push(filterClauseVariable1, filterClauseVariable2);\n const filterClause: FilterClause = {\n clause: clause,\n clauseVariable: filterClauseVariableArray,\n };\n\n return filterClause;\n}\n\nfunction handleIsNullOperator(filter: FieldFilter): FilterClause {\n const clauseVariableName = `clauseVariable${nonSecureRandomAlphaNumeric()}`;\n const clause = `${filter.field}: {${getGraphQLOperator(FieldFilterOperatorEnum.IsNull)}: $${clauseVariableName}}`;\n\n const filterClauseVariable: FilterClauseVariable = {\n clauseVariableName: clauseVariableName,\n formattedValue: convertToBoolean(filter.value),\n clauseVariableType: 'Boolean',\n };\n const filterClauseVariableArray: FilterClauseVariable[] = [];\n filterClauseVariableArray.push(filterClauseVariable);\n const clauseObject: FilterClause = {\n clauseVariable: filterClauseVariableArray,\n clause,\n };\n\n return clauseObject;\n}\n\nfunction isEnumFilter(\n fieldName: string,\n type: 'ProcessDefinition' | 'ProcessInstance',\n): boolean {\n if (type === 'ProcessInstance') {\n if (fieldName === 'state') {\n return true;\n }\n }\n return false;\n}\n\nfunction isValidEnumOperator(operator: FieldFilterOperatorEnum): boolean {\n return (\n operator === FieldFilterOperatorEnum.In ||\n operator === FieldFilterOperatorEnum.Eq\n );\n}\n\nfunction handleBinaryOperator(\n binaryFilter: FieldFilter,\n fieldDef: IntrospectionField | undefined,\n type: 'ProcessDefinition' | 'ProcessInstance',\n): FilterClause {\n if (isEnumFilter(binaryFilter.field, type)) {\n if (!isValidEnumOperator(binaryFilter.operator)) {\n throw new Error(\n `Invalid operator ${binaryFilter.operator} for enum field ${binaryFilter.field} filter`,\n );\n }\n }\n let formattedValue: any;\n let paramType: string;\n if (Array.isArray(binaryFilter.value)) {\n formattedValue = binaryFilter.value.map(v =>\n formatValue(binaryFilter.field, v, fieldDef, type),\n );\n paramType = isEnumFilter(binaryFilter.field, type)\n ? '[ProcessInstanceState!]'\n : '[String!]';\n } else {\n formattedValue = formatValue(\n binaryFilter.field,\n binaryFilter.value,\n fieldDef,\n type,\n );\n paramType = 'String';\n }\n\n const clauseVariableName = `clauseVariable${nonSecureRandomAlphaNumeric()}`;\n const clause = `${binaryFilter.field}: {${getGraphQLOperator(binaryFilter.operator)}: $${clauseVariableName}}`;\n const filterClauseVariable: FilterClauseVariable = {\n clauseVariableName: clauseVariableName,\n formattedValue: formattedValue,\n clauseVariableType: paramType,\n };\n const filterClauseVariableArray: FilterClauseVariable[] = [];\n filterClauseVariableArray.push(filterClauseVariable);\n const clauseObject: FilterClause = {\n clauseVariable: filterClauseVariableArray,\n clause,\n };\n\n return clauseObject;\n}\n\nexport function buildFilterCondition(\n introspection: IntrospectionField[],\n type: ProcessType,\n filters?: Filter,\n isNested?: boolean,\n): FilterClause {\n if (!filters) {\n return {} as FilterClause;\n }\n\n if (isNestedFilter(filters)) {\n return handleNestedFilter(introspection, type, filters);\n }\n\n if (isLogicalFilter(filters)) {\n return handleLogicalFilter(introspection, type, filters);\n }\n\n if (!isOperatorSupported(filters.operator)) {\n throw new Error(\n `Unsupported operator ${filters.operator}. Supported operators are: ${supportedOperators.join(', ')}`,\n );\n }\n\n let fieldDef;\n\n if (!isNested) {\n fieldDef = introspection.find(f => f.name === filters.field);\n if (!fieldDef) {\n throw new Error(`Can't find field \"${filters.field}\" definition`);\n }\n\n if (!isOperatorAllowedForField(filters.operator, fieldDef, type)) {\n const allowedOperators =\n supportedOperatorsByType[fieldDef.type.name] || [];\n throw new Error(\n `Unsupported operator ${filters.operator} for field \"${fieldDef.name}\" of type \"${fieldDef.type.name}\". Allowed operators are: ${allowedOperators.join(', ')}`,\n );\n }\n }\n\n switch (filters.operator) {\n case FieldFilterOperatorEnum.IsNull:\n return handleIsNullOperator(filters);\n case FieldFilterOperatorEnum.Between:\n return handleBetweenOperator(filters);\n case FieldFilterOperatorEnum.Eq:\n case FieldFilterOperatorEnum.Like:\n case FieldFilterOperatorEnum.In:\n case FieldFilterOperatorEnum.Gt:\n case FieldFilterOperatorEnum.Gte:\n case FieldFilterOperatorEnum.Lt:\n case FieldFilterOperatorEnum.Lte:\n return handleBinaryOperator(filters, fieldDef, type);\n\n default:\n throw new Error(`Can't build filter condition`);\n }\n}\n\nfunction isOperatorSupported(operator: FieldFilterOperatorEnum): boolean {\n return supportedOperators.includes(operator);\n}\n\nfunction isFieldFilterSupported(fieldDef: IntrospectionField): boolean {\n return fieldDef?.type.name === TypeName.String;\n}\n\nexport function isOperatorAllowedForField(\n operator: FieldFilterOperatorEnum,\n fieldDef: IntrospectionField,\n type: ProcessType,\n): boolean {\n if (isEnumFilter(fieldDef.name, type) && isValidEnumOperator(operator)) {\n return true;\n }\n\n const allowedForType = supportedOperatorsByType[fieldDef.type.name];\n return allowedForType ? allowedForType.includes(operator) : false;\n}\n\nfunction convertToBoolean(value: any): boolean {\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'string') {\n return value.toLowerCase() === 'true';\n }\n if (typeof value === 'number') {\n return value === 1;\n }\n return false; // Default to false for unsupported types\n}\n\nfunction formatValue(\n fieldName: string,\n fieldValue: any,\n fieldDef: IntrospectionField | undefined,\n type: ProcessType,\n): string {\n if (!fieldDef) {\n return `${fieldValue}`;\n }\n\n if (!isFieldFilterSupported) {\n throw new Error(`Unsupported field type ${fieldDef.type.name}`);\n }\n\n if (isEnumFilter(fieldName, type)) {\n return `${fieldValue}`;\n }\n if (\n fieldDef.type.name === TypeName.String ||\n fieldDef.type.name === TypeName.Id ||\n fieldDef.type.name === TypeName.Date\n ) {\n return `${fieldValue}`;\n }\n throw new Error(\n `Failed to format value for ${fieldName} ${fieldValue} with type ${fieldDef.type.name}`,\n );\n}\n\nfunction getGraphQLOperator(operator: FieldFilterOperatorEnum): string {\n switch (operator) {\n case 'EQ':\n return 'equal';\n case 'LIKE':\n return 'like';\n case 'IN':\n return 'in';\n case 'IS_NULL':\n return 'isNull';\n case 'GT':\n return 'greaterThan';\n case 'GTE':\n return 'greaterThanEqual';\n case 'LT':\n return 'lessThan';\n case 'LTE':\n return 'lessThanEqual';\n case 'BETWEEN':\n return 'between';\n default:\n throw new Error(`Operation \"${operator}\" not supported`);\n }\n}\n\n// Function for getting 4 random digits to append to the clause variable name.\n// Not used for any secrets or anything\nfunction nonSecureRandomAlphaNumeric() {\n return randomBytes(8).toString('hex');\n}\n"],"names":["FieldFilterOperatorEnum","TypeName","randomBytes"],"mappings":"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"}
|
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
function buildGraphQlQuery(args) {
|
|
4
|
-
|
|
4
|
+
const queryHeaderStart = "query (";
|
|
5
|
+
const queryHeaderEnd = ")";
|
|
6
|
+
const queryHeaderPaginationOrderByParams = `$paginationInfo: Pagination, $orderByInfo: ${args.type.slice(0, -1)}OrderBy`;
|
|
7
|
+
const filterParams = args.filterCondition?.clauseVariable?.map((cl) => {
|
|
8
|
+
return `$${cl.clauseVariableName}: ${cl.clauseVariableType}`;
|
|
9
|
+
}).join(", ");
|
|
10
|
+
const params = [queryHeaderPaginationOrderByParams, filterParams].filter(Boolean).join(", ");
|
|
11
|
+
let query = `${queryHeaderStart}${params}${queryHeaderEnd}{${args.type}`;
|
|
5
12
|
const whereClause = buildWhereClause(args.whereClause);
|
|
6
|
-
const paginationClause =
|
|
7
|
-
|
|
13
|
+
const paginationClause = "pagination: $paginationInfo";
|
|
14
|
+
const orderByClause = "orderBy: $orderByInfo";
|
|
15
|
+
{
|
|
8
16
|
query += " (";
|
|
9
|
-
query += [whereClause, paginationClause].filter(Boolean).join(", ");
|
|
17
|
+
query += [whereClause, orderByClause, paginationClause].filter(Boolean).join(", ");
|
|
10
18
|
query += ") ";
|
|
11
19
|
}
|
|
12
20
|
query += ` {${args.queryBody} } }`;
|
|
@@ -15,26 +23,36 @@ function buildGraphQlQuery(args) {
|
|
|
15
23
|
function buildWhereClause(whereClause) {
|
|
16
24
|
return whereClause ? `where: {${whereClause}}` : "";
|
|
17
25
|
}
|
|
18
|
-
function
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
parts.push(
|
|
23
|
-
`orderBy: {${pagination.sortField}: ${pagination.order !== void 0 ? pagination.order?.toUpperCase() : "ASC"}}`
|
|
24
|
-
);
|
|
26
|
+
function buildOrderByVariables(pagination) {
|
|
27
|
+
const orderByVariable = {};
|
|
28
|
+
if (pagination?.sortField !== void 0) {
|
|
29
|
+
orderByVariable[pagination.sortField] = pagination.order?.toUpperCase() ?? "ASC";
|
|
25
30
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
if (pagination
|
|
31
|
-
|
|
31
|
+
return orderByVariable;
|
|
32
|
+
}
|
|
33
|
+
function buildPaginationVariables(pagination) {
|
|
34
|
+
const paginationVariable = {};
|
|
35
|
+
if (pagination?.limit !== void 0) {
|
|
36
|
+
paginationVariable.limit = pagination.limit;
|
|
32
37
|
}
|
|
33
|
-
if (
|
|
34
|
-
|
|
38
|
+
if (pagination?.offset !== void 0) {
|
|
39
|
+
paginationVariable.offset = pagination.offset;
|
|
35
40
|
}
|
|
36
|
-
return
|
|
41
|
+
return paginationVariable;
|
|
42
|
+
}
|
|
43
|
+
function buildQueryParamVariable(pagination, filterCondition) {
|
|
44
|
+
const paramVariables = {
|
|
45
|
+
paginationInfo: buildPaginationVariables(pagination),
|
|
46
|
+
orderByInfo: buildOrderByVariables(pagination)
|
|
47
|
+
};
|
|
48
|
+
filterCondition?.clauseVariable?.forEach((p) => {
|
|
49
|
+
paramVariables[p.clauseVariableName] = p.formattedValue;
|
|
50
|
+
});
|
|
51
|
+
return paramVariables;
|
|
37
52
|
}
|
|
38
53
|
|
|
39
54
|
exports.buildGraphQlQuery = buildGraphQlQuery;
|
|
55
|
+
exports.buildOrderByVariables = buildOrderByVariables;
|
|
56
|
+
exports.buildPaginationVariables = buildPaginationVariables;
|
|
57
|
+
exports.buildQueryParamVariable = buildQueryParamVariable;
|
|
40
58
|
//# sourceMappingURL=queryBuilder.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryBuilder.cjs.js","sources":["../../src/helpers/queryBuilder.ts"],"sourcesContent":["/*\n * Copyright
|
|
1
|
+
{"version":3,"file":"queryBuilder.cjs.js","sources":["../../src/helpers/queryBuilder.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FilterClause } from '../types/filterClause';\nimport { Pagination, PaginationQueryVariable } from '../types/pagination';\n\nexport function buildGraphQlQuery(args: {\n type: 'ProcessDefinitions' | 'ProcessInstances' | 'Jobs';\n queryBody: string;\n whereClause?: string;\n pagination?: Pagination;\n filterCondition?: FilterClause;\n}): string {\n const queryHeaderStart = 'query (';\n const queryHeaderEnd = ')';\n\n const queryHeaderPaginationOrderByParams = `$paginationInfo: Pagination, $orderByInfo: ${args.type.slice(0, -1)}OrderBy`;\n\n const filterParams = args.filterCondition?.clauseVariable\n ?.map(cl => {\n return `$${cl.clauseVariableName}: ${cl.clauseVariableType}`;\n })\n .join(', ');\n\n const params = [queryHeaderPaginationOrderByParams, filterParams]\n .filter(Boolean)\n .join(', ');\n\n let query = `${queryHeaderStart}${params}${queryHeaderEnd}{${args.type}`;\n const whereClause = buildWhereClause(args.whereClause);\n\n const paginationClause = 'pagination: $paginationInfo';\n const orderByClause = 'orderBy: $orderByInfo';\n\n if (whereClause || paginationClause || orderByClause) {\n query += ' (';\n query += [whereClause, orderByClause, paginationClause]\n .filter(Boolean)\n .join(', ');\n query += ') ';\n }\n\n query += ` {${args.queryBody} } }`;\n\n return query.replace(/\\s+/g, ' ').trim();\n}\n\nfunction buildWhereClause(whereClause?: string): string {\n return whereClause ? `where: {${whereClause}}` : '';\n}\n\nexport function buildOrderByVariables(pagination?: Pagination): {\n [key: string]: string;\n} {\n const orderByVariable: { [key: string]: string } = {};\n\n if (pagination?.sortField !== undefined) {\n orderByVariable[pagination.sortField] =\n pagination.order?.toUpperCase() ?? 'ASC';\n }\n\n return orderByVariable;\n}\n\nexport function buildPaginationVariables(\n pagination?: Pagination,\n): PaginationQueryVariable {\n const paginationVariable: PaginationQueryVariable = {};\n\n if (pagination?.limit !== undefined) {\n paginationVariable.limit = pagination.limit;\n }\n\n if (pagination?.offset !== undefined) {\n paginationVariable.offset = pagination.offset;\n }\n return paginationVariable;\n}\n\nexport function buildQueryParamVariable(\n pagination?: Pagination,\n filterCondition?: FilterClause,\n) {\n const paramVariables: any = {\n paginationInfo: buildPaginationVariables(pagination),\n orderByInfo: buildOrderByVariables(pagination),\n };\n\n filterCondition?.clauseVariable?.forEach(p => {\n paramVariables[p.clauseVariableName] = p.formattedValue;\n });\n\n return paramVariables;\n}\n"],"names":[],"mappings":";;AAmBO,SAAS,kBAAkB,IAAA,EAMvB;AACT,EAAA,MAAM,gBAAA,GAAmB,SAAA;AACzB,EAAA,MAAM,cAAA,GAAiB,GAAA;AAEvB,EAAA,MAAM,qCAAqC,CAAA,2CAAA,EAA8C,IAAA,CAAK,KAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,OAAA,CAAA;AAE/G,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,eAAA,EAAiB,cAAA,EACvC,IAAI,CAAA,EAAA,KAAM;AACV,IAAA,OAAO,CAAA,CAAA,EAAI,EAAA,CAAG,kBAAkB,CAAA,EAAA,EAAK,GAAG,kBAAkB,CAAA,CAAA;AAAA,EAC5D,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,EAAA,MAAM,MAAA,GAAS,CAAC,kCAAA,EAAoC,YAAY,EAC7D,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,IAAI,CAAA;AAEZ,EAAA,IAAI,KAAA,GAAQ,GAAG,gBAAgB,CAAA,EAAG,MAAM,CAAA,EAAG,cAAc,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA;AACtE,EAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,IAAA,CAAK,WAAW,CAAA;AAErD,EAAA,MAAM,gBAAA,GAAmB,6BAAA;AACzB,EAAA,MAAM,aAAA,GAAgB,uBAAA;AAEtB,EAAsD;AACpD,IAAA,KAAA,IAAS,IAAA;AACT,IAAA,KAAA,IAAS,CAAC,aAAa,aAAA,EAAe,gBAAgB,EACnD,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,IAAI,CAAA;AACZ,IAAA,KAAA,IAAS,IAAA;AAAA,EACX;AAEA,EAAA,KAAA,IAAS,CAAA,EAAA,EAAK,KAAK,SAAS,CAAA,IAAA,CAAA;AAE5B,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AACzC;AAEA,SAAS,iBAAiB,WAAA,EAA8B;AACtD,EAAA,OAAO,WAAA,GAAc,CAAA,QAAA,EAAW,WAAW,CAAA,CAAA,CAAA,GAAM,EAAA;AACnD;AAEO,SAAS,sBAAsB,UAAA,EAEpC;AACA,EAAA,MAAM,kBAA6C,EAAC;AAEpD,EAAA,IAAI,UAAA,EAAY,cAAc,MAAA,EAAW;AACvC,IAAA,eAAA,CAAgB,WAAW,SAAS,CAAA,GAClC,UAAA,CAAW,KAAA,EAAO,aAAY,IAAK,KAAA;AAAA,EACvC;AAEA,EAAA,OAAO,eAAA;AACT;AAEO,SAAS,yBACd,UAAA,EACyB;AACzB,EAAA,MAAM,qBAA8C,EAAC;AAErD,EAAA,IAAI,UAAA,EAAY,UAAU,MAAA,EAAW;AACnC,IAAA,kBAAA,CAAmB,QAAQ,UAAA,CAAW,KAAA;AAAA,EACxC;AAEA,EAAA,IAAI,UAAA,EAAY,WAAW,MAAA,EAAW;AACpC,IAAA,kBAAA,CAAmB,SAAS,UAAA,CAAW,MAAA;AAAA,EACzC;AACA,EAAA,OAAO,kBAAA;AACT;AAEO,SAAS,uBAAA,CACd,YACA,eAAA,EACA;AACA,EAAA,MAAM,cAAA,GAAsB;AAAA,IAC1B,cAAA,EAAgB,yBAAyB,UAAU,CAAA;AAAA,IACnD,WAAA,EAAa,sBAAsB,UAAU;AAAA,GAC/C;AAEA,EAAA,eAAA,EAAiB,cAAA,EAAgB,QAAQ,CAAA,CAAA,KAAK;AAC5C,IAAA,cAAA,CAAe,CAAA,CAAE,kBAAkB,CAAA,GAAI,CAAA,CAAE,cAAA;AAAA,EAC3C,CAAC,CAAA;AAED,EAAA,OAAO,cAAA;AACT;;;;;;;"}
|
|
@@ -16,6 +16,8 @@ class DataIndexService {
|
|
|
16
16
|
}
|
|
17
17
|
this.client = this.getNewGraphQLClient();
|
|
18
18
|
}
|
|
19
|
+
dataIndexUrl;
|
|
20
|
+
logger;
|
|
19
21
|
client;
|
|
20
22
|
processDefinitionArguments = [];
|
|
21
23
|
processInstanceArguments = [];
|
|
@@ -84,8 +86,22 @@ class DataIndexService {
|
|
|
84
86
|
return pairs;
|
|
85
87
|
}
|
|
86
88
|
async fetchWorkflowInfo(definitionId) {
|
|
87
|
-
const graphQlQuery = `
|
|
88
|
-
|
|
89
|
+
const graphQlQuery = core.gql`
|
|
90
|
+
query FindProcessInstanceQuery($definitionId: String!) {
|
|
91
|
+
ProcessDefinitions(where: { id: { equal: $definitionId } }) {
|
|
92
|
+
id
|
|
93
|
+
name
|
|
94
|
+
version
|
|
95
|
+
type
|
|
96
|
+
endpoint
|
|
97
|
+
serviceUrl
|
|
98
|
+
source
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
`;
|
|
102
|
+
const result = await this.client.query(graphQlQuery, {
|
|
103
|
+
definitionId
|
|
104
|
+
});
|
|
89
105
|
this.logger.debug(
|
|
90
106
|
`Get workflow definition result: ${JSON.stringify(result)}`
|
|
91
107
|
);
|
|
@@ -143,9 +159,9 @@ class DataIndexService {
|
|
|
143
159
|
) : void 0;
|
|
144
160
|
let whereClause;
|
|
145
161
|
if (definitionIdsCondition && filterCondition) {
|
|
146
|
-
whereClause = `and: [{${definitionIdsCondition}}, {${filterCondition}}]`;
|
|
162
|
+
whereClause = `and: [{${definitionIdsCondition}}, {${filterCondition?.clause}}]`;
|
|
147
163
|
} else if (definitionIdsCondition || filterCondition) {
|
|
148
|
-
whereClause = definitionIdsCondition ?? filterCondition;
|
|
164
|
+
whereClause = definitionIdsCondition ?? filterCondition?.clause;
|
|
149
165
|
} else {
|
|
150
166
|
whereClause = void 0;
|
|
151
167
|
}
|
|
@@ -153,10 +169,12 @@ class DataIndexService {
|
|
|
153
169
|
type: "ProcessDefinitions",
|
|
154
170
|
queryBody: "id, name, version, type, endpoint, serviceUrl, source, metadata",
|
|
155
171
|
whereClause,
|
|
156
|
-
|
|
172
|
+
filterCondition
|
|
157
173
|
});
|
|
158
174
|
this.logger.debug(`GraphQL query: ${graphQlQuery}`);
|
|
159
|
-
const
|
|
175
|
+
const paramVariables = queryBuilder.buildQueryParamVariable(pagination, filterCondition);
|
|
176
|
+
this.logger.debug(`GraphQL query params:`, paramVariables);
|
|
177
|
+
const result = await this.client.query(graphQlQuery, paramVariables);
|
|
160
178
|
this.logger.debug(
|
|
161
179
|
`Get workflow definitions result: ${JSON.stringify(result)}`
|
|
162
180
|
);
|
|
@@ -176,7 +194,7 @@ class DataIndexService {
|
|
|
176
194
|
await this.inspectInputArgument(type),
|
|
177
195
|
type,
|
|
178
196
|
filter
|
|
179
|
-
) :
|
|
197
|
+
) : void 0;
|
|
180
198
|
let whereClause = "";
|
|
181
199
|
const conditions = [];
|
|
182
200
|
{
|
|
@@ -185,8 +203,8 @@ class DataIndexService {
|
|
|
185
203
|
if (definitionIdsCondition) {
|
|
186
204
|
conditions.push(`{${definitionIdsCondition}}`);
|
|
187
205
|
}
|
|
188
|
-
if (
|
|
189
|
-
conditions.push(`{${filterCondition}}`);
|
|
206
|
+
if (filterCondition) {
|
|
207
|
+
conditions.push(`{${filterCondition?.clause}}`);
|
|
190
208
|
}
|
|
191
209
|
if (conditions.length === 0) {
|
|
192
210
|
whereClause = processIdNotNullCondition;
|
|
@@ -199,10 +217,12 @@ class DataIndexService {
|
|
|
199
217
|
type: "ProcessInstances",
|
|
200
218
|
queryBody: "id, processName, processId, state, start, end, nodes { id }, variables, executionSummary, parentProcessInstance {id, processName, businessKey}",
|
|
201
219
|
whereClause,
|
|
202
|
-
|
|
220
|
+
filterCondition
|
|
203
221
|
});
|
|
204
222
|
this.logger.debug(`GraphQL query: ${graphQlQuery}`);
|
|
205
|
-
const
|
|
223
|
+
const paramVariables = queryBuilder.buildQueryParamVariable(pagination, filterCondition);
|
|
224
|
+
this.logger.debug(`GraphQL query params:`, paramVariables);
|
|
225
|
+
const result = await this.client.query(graphQlQuery, paramVariables);
|
|
206
226
|
this.logger.debug(
|
|
207
227
|
`Fetch process instances result: ${JSON.stringify(result)}`
|
|
208
228
|
);
|
|
@@ -232,7 +252,7 @@ class DataIndexService {
|
|
|
232
252
|
type,
|
|
233
253
|
targetEntityFilter
|
|
234
254
|
);
|
|
235
|
-
const whereClause = `and: [{${processIdNotNullCondition}}, {${filterCondition}}]`;
|
|
255
|
+
const whereClause = `and: [{${processIdNotNullCondition}}, {${filterCondition.clause}}]`;
|
|
236
256
|
const pagination = {
|
|
237
257
|
limit: 1e3,
|
|
238
258
|
offset: 0
|
|
@@ -241,10 +261,12 @@ class DataIndexService {
|
|
|
241
261
|
type: "ProcessInstances",
|
|
242
262
|
queryBody: "processId",
|
|
243
263
|
whereClause,
|
|
244
|
-
|
|
264
|
+
filterCondition
|
|
245
265
|
});
|
|
246
266
|
this.logger.debug(`GraphQL query: ${graphQlQuery}`);
|
|
247
|
-
const
|
|
267
|
+
const paramVariables = queryBuilder.buildQueryParamVariable(pagination, filterCondition);
|
|
268
|
+
this.logger.debug(`GraphQL query params:`, paramVariables);
|
|
269
|
+
const result = await this.client.query(graphQlQuery, paramVariables);
|
|
248
270
|
this.logger.debug(
|
|
249
271
|
`Fetch definition ids from instances history result: ${JSON.stringify(result)}`
|
|
250
272
|
);
|
|
@@ -271,8 +293,17 @@ class DataIndexService {
|
|
|
271
293
|
return instance;
|
|
272
294
|
}
|
|
273
295
|
async fetchWorkflowSource(definitionId) {
|
|
274
|
-
const graphQlQuery = `
|
|
275
|
-
|
|
296
|
+
const graphQlQuery = core.gql`
|
|
297
|
+
query FindProcessInstanceQuery($definitionId: String!) {
|
|
298
|
+
ProcessDefinitions(where: { id: { equal: $definitionId } }) {
|
|
299
|
+
id
|
|
300
|
+
source
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
`;
|
|
304
|
+
const result = await this.client.query(graphQlQuery, {
|
|
305
|
+
definitionId
|
|
306
|
+
});
|
|
276
307
|
this.logger.debug(
|
|
277
308
|
`Fetch workflow source result: ${JSON.stringify(result)}`
|
|
278
309
|
);
|
|
@@ -288,9 +319,29 @@ class DataIndexService {
|
|
|
288
319
|
return processDefinitions[0].source;
|
|
289
320
|
}
|
|
290
321
|
async fetchInstancesByDefinitionId(args) {
|
|
291
|
-
const targetEntityWhereCondition = args.targetEntity ? `, variables: {targetEntity: {equal:
|
|
292
|
-
const graphQlQuery = `
|
|
293
|
-
|
|
322
|
+
const targetEntityWhereCondition = args.targetEntity ? `, variables: {targetEntity: {equal: $targetEntity } }` : "";
|
|
323
|
+
const graphQlQuery = core.gql`
|
|
324
|
+
query FindProcessInstanceQuery($definitionId: String!, $limit: Int!, $offset: Int! ${args.targetEntity ? `, $targetEntity: String` : ""}) {
|
|
325
|
+
ProcessInstances(
|
|
326
|
+
where: {processId: {equal: $definitionId } ${targetEntityWhereCondition} },
|
|
327
|
+
orderBy: {start:DESC},
|
|
328
|
+
pagination: {limit: $limit, offset: $offset}
|
|
329
|
+
) { id, processName, state, start, end }
|
|
330
|
+
}
|
|
331
|
+
`;
|
|
332
|
+
const result = await this.client.query(
|
|
333
|
+
graphQlQuery,
|
|
334
|
+
args.targetEntity ? {
|
|
335
|
+
definitionId: args.definitionId,
|
|
336
|
+
limit: args.limit,
|
|
337
|
+
offset: args.offset,
|
|
338
|
+
targetEntity: args.targetEntity
|
|
339
|
+
} : {
|
|
340
|
+
definitionId: args.definitionId,
|
|
341
|
+
limit: args.limit,
|
|
342
|
+
offset: args.offset
|
|
343
|
+
}
|
|
344
|
+
);
|
|
294
345
|
this.logger.debug(
|
|
295
346
|
`Fetch workflow instances result: ${JSON.stringify(result)}`
|
|
296
347
|
);
|
|
@@ -301,8 +352,16 @@ class DataIndexService {
|
|
|
301
352
|
return result.data.ProcessInstances;
|
|
302
353
|
}
|
|
303
354
|
async fetchInstanceVariables(instanceId) {
|
|
304
|
-
const graphQlQuery = `
|
|
305
|
-
|
|
355
|
+
const graphQlQuery = core.gql`
|
|
356
|
+
query FindProcessInstanceQuery($instanceId: String!) {
|
|
357
|
+
ProcessInstances(where: { id: { equal: $instanceId } }) {
|
|
358
|
+
variables
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
`;
|
|
362
|
+
const result = await this.client.query(graphQlQuery, {
|
|
363
|
+
instanceId
|
|
364
|
+
});
|
|
306
365
|
this.logger.debug(
|
|
307
366
|
`Fetch process instance variables result: ${JSON.stringify(result)}`
|
|
308
367
|
);
|
|
@@ -317,8 +376,16 @@ class DataIndexService {
|
|
|
317
376
|
return backstagePluginOrchestratorCommon.parseWorkflowVariables(processInstances[0].variables);
|
|
318
377
|
}
|
|
319
378
|
async fetchDefinitionIdByInstanceId(instanceId) {
|
|
320
|
-
const graphQlQuery = `
|
|
321
|
-
|
|
379
|
+
const graphQlQuery = core.gql`
|
|
380
|
+
query FindProcessInstanceQuery($instanceId: String!) {
|
|
381
|
+
ProcessInstances(where: { id: { equal: $instanceId } }) {
|
|
382
|
+
processId
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
`;
|
|
386
|
+
const result = await this.client.query(graphQlQuery, {
|
|
387
|
+
instanceId
|
|
388
|
+
});
|
|
322
389
|
this.logger.debug(
|
|
323
390
|
`Fetch process id from instance result: ${JSON.stringify(result)}`
|
|
324
391
|
);
|