@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 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
- return `${filter.operator.toLowerCase()}: {${subClauses.join(", ")}}`;
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
- return `${filter.field}: {${subClauses}}`;
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
- return `${filter.field}: {${getGraphQLOperator(
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: "${filter.value[0]}", to: "${filter.value[1]}"}}`;
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
- return `${filter.field}: {${getGraphQLOperator(
70
- backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.IsNull
71
- )}: ${convertToBoolean(filter.value)}}`;
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
- const formattedValue = Array.isArray(binaryFilter.value) ? `[${binaryFilter.value.map((v) => formatValue(binaryFilter.field, v, fieldDef, type)).join(", ")}]` : formatValue(binaryFilter.field, binaryFilter.value, fieldDef, type);
93
- return `${binaryFilter.field}: {${getGraphQLOperator(
94
- binaryFilter.operator
95
- )}: ${formattedValue}}`;
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 `"${fieldValue}"`;
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 `"${fieldValue}"`;
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
- let query = `{${args.type}`;
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 = buildPaginationClause(args.pagination);
7
- if (whereClause || paginationClause) {
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 buildPaginationClause(pagination) {
19
- if (!pagination) return "";
20
- const parts = [];
21
- if (pagination.sortField !== void 0) {
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
- const paginationParts = [];
27
- if (pagination.limit !== void 0) {
28
- paginationParts.push(`limit: ${pagination.limit}`);
29
- }
30
- if (pagination.offset !== void 0) {
31
- paginationParts.push(`offset: ${pagination.offset}`);
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 (paginationParts.length) {
34
- parts.push(`pagination: {${paginationParts.join(", ")}}`);
38
+ if (pagination?.offset !== void 0) {
39
+ paginationVariable.offset = pagination.offset;
35
40
  }
36
- return parts.join(", ");
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 2024 The Backstage Authors\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 */\nimport { Pagination } from '../types/pagination';\n\nexport function buildGraphQlQuery(args: {\n type: 'ProcessDefinitions' | 'ProcessInstances' | 'Jobs';\n queryBody: string;\n whereClause?: string;\n pagination?: Pagination;\n}): string {\n let query = `{${args.type}`;\n\n const whereClause = buildWhereClause(args.whereClause);\n const paginationClause = buildPaginationClause(args.pagination);\n\n if (whereClause || paginationClause) {\n query += ' (';\n query += [whereClause, paginationClause].filter(Boolean).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\nfunction buildPaginationClause(pagination?: Pagination): string {\n if (!pagination) return '';\n\n const parts = [];\n\n if (pagination.sortField !== undefined) {\n parts.push(\n `orderBy: {${pagination.sortField}: ${\n pagination.order !== undefined ? pagination.order?.toUpperCase() : 'ASC'\n }}`,\n );\n }\n\n const paginationParts = [];\n if (pagination.limit !== undefined) {\n paginationParts.push(`limit: ${pagination.limit}`);\n }\n if (pagination.offset !== undefined) {\n paginationParts.push(`offset: ${pagination.offset}`);\n }\n if (paginationParts.length) {\n parts.push(`pagination: {${paginationParts.join(', ')}}`);\n }\n\n return parts.join(', ');\n}\n"],"names":[],"mappings":";;AAiBO,SAAS,kBAAkB,IAAA,EAKvB;AACT,EAAA,IAAI,KAAA,GAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA;AAEzB,EAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,IAAA,CAAK,WAAW,CAAA;AACrD,EAAA,MAAM,gBAAA,GAAmB,qBAAA,CAAsB,IAAA,CAAK,UAAU,CAAA;AAE9D,EAAA,IAAI,eAAe,gBAAA,EAAkB;AACnC,IAAA,KAAA,IAAS,IAAA;AACT,IAAA,KAAA,IAAS,CAAC,aAAa,gBAAgB,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AAClE,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;AAEA,SAAS,sBAAsB,UAAA,EAAiC;AAC9D,EAAA,IAAI,CAAC,YAAY,OAAO,EAAA;AAExB,EAAA,MAAM,QAAQ,EAAC;AAEf,EAAA,IAAI,UAAA,CAAW,cAAc,MAAA,EAAW;AACtC,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,UAAA,EAAa,UAAA,CAAW,SAAS,CAAA,EAAA,EAC/B,UAAA,CAAW,KAAA,KAAU,MAAA,GAAY,UAAA,CAAW,KAAA,EAAO,WAAA,EAAY,GAAI,KACrE,CAAA,CAAA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,kBAAkB,EAAC;AACzB,EAAA,IAAI,UAAA,CAAW,UAAU,MAAA,EAAW;AAClC,IAAA,eAAA,CAAgB,IAAA,CAAK,CAAA,OAAA,EAAU,UAAA,CAAW,KAAK,CAAA,CAAE,CAAA;AAAA,EACnD;AACA,EAAA,IAAI,UAAA,CAAW,WAAW,MAAA,EAAW;AACnC,IAAA,eAAA,CAAgB,IAAA,CAAK,CAAA,QAAA,EAAW,UAAA,CAAW,MAAM,CAAA,CAAE,CAAA;AAAA,EACrD;AACA,EAAA,IAAI,gBAAgB,MAAA,EAAQ;AAC1B,IAAA,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EAC1D;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;;"}
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 = `{ ProcessDefinitions ( where: {id: {equal: "${definitionId}" } } ) { id, name, version, type, endpoint, serviceUrl, source } }`;
88
- const result = await this.client.query(graphQlQuery, {});
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
- pagination
172
+ filterCondition
157
173
  });
158
174
  this.logger.debug(`GraphQL query: ${graphQlQuery}`);
159
- const result = await this.client.query(graphQlQuery, {});
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 (filter) {
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
- pagination
220
+ filterCondition
203
221
  });
204
222
  this.logger.debug(`GraphQL query: ${graphQlQuery}`);
205
- const result = await this.client.query(graphQlQuery, {});
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
- pagination
264
+ filterCondition
245
265
  });
246
266
  this.logger.debug(`GraphQL query: ${graphQlQuery}`);
247
- const result = await this.client.query(graphQlQuery, {});
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 = `{ ProcessDefinitions ( where: {id: {equal: "${definitionId}" } } ) { id, source } }`;
275
- const result = await this.client.query(graphQlQuery, {});
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: "${args.targetEntity}" } }` : "";
292
- const graphQlQuery = `{ ProcessInstances( where: {processId: {equal: "${args.definitionId}" } ${targetEntityWhereCondition} }, orderBy: {start:DESC}, pagination: {limit: ${args.limit}, offset: ${args.offset}}) { id, processName, state, start, end } }`;
293
- const result = await this.client.query(graphQlQuery, {});
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 = `{ ProcessInstances (where: { id: {equal: "${instanceId}" } } ) { variables } }`;
305
- const result = await this.client.query(graphQlQuery, {});
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 = `{ ProcessInstances (where: { id: {equal: "${instanceId}" } } ) { processId } }`;
321
- const result = await this.client.query(graphQlQuery, {});
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
  );