@red-hat-developer-hub/backstage-plugin-orchestrator-backend 5.1.1 → 5.2.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,29 @@
1
1
  ### Dependencies
2
2
 
3
+ ## 5.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 967c377: Fixed unsupported filter operators
8
+
9
+ ### Patch Changes
10
+
11
+ - e3ebb0c: replace abort mutation with call to delete
12
+ - 665947d: fix bug in error handling of execute API
13
+ - 4e3ccc2: Add retrigger option to UI using v2 API
14
+ - d1010f9: improve logging of router
15
+ - bee24dc: add unavailable workflows to cache and overview
16
+ - b0e3ede: improve data index network error
17
+ - 10f17e3: Fixed a typo in FilterBuilder error message
18
+ - aebd2b0: improved devMode, added podman and macos support
19
+ - Updated dependencies [967c377]
20
+ - Updated dependencies [05a1ce0]
21
+ - Updated dependencies [816d8bc]
22
+ - Updated dependencies [c7de094]
23
+ - Updated dependencies [bee24dc]
24
+ - Updated dependencies [d4fa6bf]
25
+ - @red-hat-developer-hub/backstage-plugin-orchestrator-common@1.26.0
26
+
3
27
  ## 5.1.1
4
28
 
5
29
  ### Patch Changes
@@ -2,6 +2,39 @@
2
2
 
3
3
  var backstagePluginOrchestratorCommon = require('@red-hat-developer-hub/backstage-plugin-orchestrator-common');
4
4
 
5
+ const supportedOperators = [
6
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Eq,
7
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Like,
8
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.In,
9
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.IsNull,
10
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Gt,
11
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Gte,
12
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Lt,
13
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Lte,
14
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Between
15
+ ];
16
+ const supportedOperatorsByType = {
17
+ [backstagePluginOrchestratorCommon.TypeName.String]: [
18
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.In,
19
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Like,
20
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.IsNull,
21
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Eq
22
+ ],
23
+ [backstagePluginOrchestratorCommon.TypeName.Id]: [
24
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.In,
25
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.IsNull,
26
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Eq
27
+ ],
28
+ [backstagePluginOrchestratorCommon.TypeName.Date]: [
29
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.IsNull,
30
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Eq,
31
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Gt,
32
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Gte,
33
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Lt,
34
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Lte,
35
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Between
36
+ ]
37
+ };
5
38
  function isLogicalFilter(filter) {
6
39
  return filter.filters !== void 0;
7
40
  }
@@ -57,15 +90,18 @@ function buildFilterCondition(introspection, type, filters) {
57
90
  return handleLogicalFilter(introspection, type, filters);
58
91
  }
59
92
  if (!isOperatorSupported(filters.operator)) {
60
- throw new Error(`Unsopported operator ${filters.operator}`);
93
+ throw new Error(
94
+ `Unsupported operator ${filters.operator}. Supported operators are: ${supportedOperators.join(", ")}`
95
+ );
61
96
  }
62
97
  const fieldDef = introspection.find((f) => f.name === filters.field);
63
98
  if (!fieldDef) {
64
99
  throw new Error(`Can't find field "${filters.field}" definition`);
65
100
  }
66
101
  if (!isOperatorAllowedForField(filters.operator, fieldDef, type)) {
102
+ const allowedOperators = supportedOperatorsByType[fieldDef.type.name] || [];
67
103
  throw new Error(
68
- `Unsupported operator ${filters.operator} for field "${fieldDef.name}" of type "${fieldDef.type.name}"`
104
+ `Unsupported operator ${filters.operator} for field "${fieldDef.name}" of type "${fieldDef.type.name}". Allowed operators are: ${allowedOperators.join(", ")}`
69
105
  );
70
106
  }
71
107
  switch (filters.operator) {
@@ -86,7 +122,7 @@ function buildFilterCondition(introspection, type, filters) {
86
122
  }
87
123
  }
88
124
  function isOperatorSupported(operator) {
89
- return operator === backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Eq || operator === backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Like || operator === backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.In || operator === backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.IsNull || operator === backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Gt || operator === backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Gte || operator === backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Lt || operator === backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Lte || operator === backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Between;
125
+ return supportedOperators.includes(operator);
90
126
  }
91
127
  function isFieldFilterSupported(fieldDef) {
92
128
  return fieldDef?.type.name === backstagePluginOrchestratorCommon.TypeName.String;
@@ -95,30 +131,7 @@ function isOperatorAllowedForField(operator, fieldDef, type) {
95
131
  if (isEnumFilter(fieldDef.name, type) && isValidEnumOperator(operator)) {
96
132
  return true;
97
133
  }
98
- const allowedOperators = {
99
- [backstagePluginOrchestratorCommon.TypeName.String]: [
100
- backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.In,
101
- backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Like,
102
- backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.IsNull,
103
- backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Eq
104
- ],
105
- [backstagePluginOrchestratorCommon.TypeName.Id]: [
106
- backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.In,
107
- backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.IsNull,
108
- backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Eq
109
- ],
110
- [backstagePluginOrchestratorCommon.TypeName.Date]: [
111
- backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.IsNull,
112
- backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Eq,
113
- backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Gt,
114
- backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Gte,
115
- backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Lt,
116
- backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Lte,
117
- backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Between
118
- ],
119
- [backstagePluginOrchestratorCommon.TypeName.StringArray]: []
120
- };
121
- const allowedForType = allowedOperators[fieldDef.type.name];
134
+ const allowedForType = supportedOperatorsByType[fieldDef.type.name];
122
135
  return allowedForType ? allowedForType.includes(operator) : false;
123
136
  }
124
137
  function convertToBoolean(value) {
@@ -165,10 +178,6 @@ function getGraphQLOperator(operator) {
165
178
  return "lessThan";
166
179
  case "LTE":
167
180
  return "lessThanEqual";
168
- // case 'CONTAINS':
169
- // return "contains"
170
- // case 'CONTAINS_ALL':
171
- // case 'CONTAINS_ANY':
172
181
  case "BETWEEN":
173
182
  return "between";
174
183
  default:
@@ -177,4 +186,5 @@ function getGraphQLOperator(operator) {
177
186
  }
178
187
 
179
188
  exports.buildFilterCondition = buildFilterCondition;
189
+ exports.isOperatorAllowedForField = isOperatorAllowedForField;
180
190
  //# sourceMappingURL=filterBuilder.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"filterBuilder.cjs.js","sources":["../../src/helpers/filterBuilder.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 {\n FieldFilter,\n FieldFilterOperatorEnum,\n Filter,\n IntrospectionField,\n LogicalFilter,\n TypeName,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\ntype ProcessType = 'ProcessDefinition' | 'ProcessInstance';\n\nfunction isLogicalFilter(filter: Filter): filter is LogicalFilter {\n return (filter as LogicalFilter).filters !== 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 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,\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): string {\n if (!filters) {\n return '';\n }\n\n if (isLogicalFilter(filters)) {\n return handleLogicalFilter(introspection, type, filters);\n }\n\n if (!isOperatorSupported(filters.operator)) {\n throw new Error(`Unsopported operator ${filters.operator}`);\n }\n\n const 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 throw new Error(\n `Unsupported operator ${filters.operator} for field \"${fieldDef.name}\" of type \"${fieldDef.type.name}\"`,\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 (\n operator === FieldFilterOperatorEnum.Eq ||\n operator === FieldFilterOperatorEnum.Like ||\n operator === FieldFilterOperatorEnum.In ||\n operator === FieldFilterOperatorEnum.IsNull ||\n operator === FieldFilterOperatorEnum.Gt ||\n operator === FieldFilterOperatorEnum.Gte ||\n operator === FieldFilterOperatorEnum.Lt ||\n operator === FieldFilterOperatorEnum.Lte ||\n operator === FieldFilterOperatorEnum.Between\n );\n}\n\nfunction isFieldFilterSupported(fieldDef: IntrospectionField): boolean {\n return fieldDef?.type.name === TypeName.String;\n}\n\nfunction 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 const allowedOperators: 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 [TypeName.StringArray]: [],\n };\n const allowedForType = allowedOperators[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,\n type: ProcessType,\n): string {\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 'CONTAINS':\n // return \"contains\"\n // case 'CONTAINS_ALL':\n // case 'CONTAINS_ANY':\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 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 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 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,\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): string {\n if (!filters) {\n return '';\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 const 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 = 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 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,\n type: ProcessType,\n): string {\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":";;;;AA2BA,MAAM,kBAAqB,GAAA;AAAA,EACzBA,yDAAwB,CAAA,EAAA;AAAA,EACxBA,yDAAwB,CAAA,IAAA;AAAA,EACxBA,yDAAwB,CAAA,EAAA;AAAA,EACxBA,yDAAwB,CAAA,MAAA;AAAA,EACxBA,yDAAwB,CAAA,EAAA;AAAA,EACxBA,yDAAwB,CAAA,GAAA;AAAA,EACxBA,yDAAwB,CAAA,EAAA;AAAA,EACxBA,yDAAwB,CAAA,GAAA;AAAA,EACxBA,yDAAwB,CAAA,OAAA;AAC1B,CAAA,CAAA;AAEA,MAAM,wBAAwE,GAAA;AAAA,EAC5E,CAACC,0CAAS,CAAA,MAAM,GAAG;AAAA,IACjBD,yDAAwB,CAAA,EAAA;AAAA,IACxBA,yDAAwB,CAAA,IAAA;AAAA,IACxBA,yDAAwB,CAAA,MAAA;AAAA,IACxBA,yDAAwB,CAAA,EAAA;AAAA,GAC1B;AAAA,EACA,CAACC,0CAAS,CAAA,EAAE,GAAG;AAAA,IACbD,yDAAwB,CAAA,EAAA;AAAA,IACxBA,yDAAwB,CAAA,MAAA;AAAA,IACxBA,yDAAwB,CAAA,EAAA;AAAA,GAC1B;AAAA,EACA,CAACC,0CAAS,CAAA,IAAI,GAAG;AAAA,IACfD,yDAAwB,CAAA,MAAA;AAAA,IACxBA,yDAAwB,CAAA,EAAA;AAAA,IACxBA,yDAAwB,CAAA,EAAA;AAAA,IACxBA,yDAAwB,CAAA,GAAA;AAAA,IACxBA,yDAAwB,CAAA,EAAA;AAAA,IACxBA,yDAAwB,CAAA,GAAA;AAAA,IACxBA,yDAAwB,CAAA,OAAA;AAAA,GAC1B;AACF,CAAA,CAAA;AAEA,SAAS,gBAAgB,MAAyC,EAAA;AAChE,EAAA,OAAQ,OAAyB,OAAY,KAAA,KAAA,CAAA,CAAA;AAC/C,CAAA;AAEA,SAAS,mBAAA,CACP,aACA,EAAA,IAAA,EACA,MACQ,EAAA;AACR,EAAI,IAAA,CAAC,MAAO,CAAA,QAAA,EAAiB,OAAA,EAAA,CAAA;AAE7B,EAAM,MAAA,UAAA,GAAa,OAAO,OAAQ,CAAA,GAAA;AAAA,IAAI,CACpC,CAAA,KAAA,oBAAA,CAAqB,aAAe,EAAA,IAAA,EAAM,CAAC,CAAA;AAAA,GAC7C,CAAA;AAEA,EAAO,OAAA,CAAA,EAAG,OAAO,QAAS,CAAA,WAAA,EAAa,CAAM,GAAA,EAAA,UAAA,CAAW,IAAK,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA;AACpE,CAAA;AAEA,SAAS,sBAAsB,MAA6B,EAAA;AAC1D,EAAI,IAAA,CAAC,MAAM,OAAQ,CAAA,MAAA,CAAO,KAAK,CAAK,IAAA,MAAA,CAAO,KAAM,CAAA,MAAA,KAAW,CAAG,EAAA;AAC7D,IAAM,MAAA,IAAI,MAAM,oDAAoD,CAAA,CAAA;AAAA,GACtE;AACA,EAAO,OAAA,CAAA,EAAG,MAAO,CAAA,KAAK,CAAM,GAAA,EAAA,kBAAA;AAAA,IAC1BA,yDAAwB,CAAA,OAAA;AAAA,GACzB,CAAa,UAAA,EAAA,MAAA,CAAO,KAAM,CAAA,CAAC,CAAC,CAAW,QAAA,EAAA,MAAA,CAAO,KAAM,CAAA,CAAC,CAAC,CAAA,GAAA,CAAA,CAAA;AACzD,CAAA;AAEA,SAAS,qBAAqB,MAA6B,EAAA;AACzD,EAAO,OAAA,CAAA,EAAG,MAAO,CAAA,KAAK,CAAM,GAAA,EAAA,kBAAA;AAAA,IAC1BA,yDAAwB,CAAA,MAAA;AAAA,GACzB,CAAA,EAAA,EAAK,gBAAiB,CAAA,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA;AACtC,CAAA;AAEA,SAAS,YAAA,CACP,WACA,IACS,EAAA;AACT,EAAA,IAAI,SAAS,iBAAmB,EAAA;AAC9B,IAAA,IAAI,cAAc,OAAS,EAAA;AACzB,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAAA,GACF;AACA,EAAO,OAAA,KAAA,CAAA;AACT,CAAA;AAEA,SAAS,oBAAoB,QAA4C,EAAA;AACvE,EAAA,OACE,QAAa,KAAAA,yDAAA,CAAwB,EACrC,IAAA,QAAA,KAAaA,yDAAwB,CAAA,EAAA,CAAA;AAEzC,CAAA;AAEA,SAAS,oBAAA,CACP,YACA,EAAA,QAAA,EACA,IACQ,EAAA;AACR,EAAA,IAAI,YAAa,CAAA,YAAA,CAAa,KAAO,EAAA,IAAI,CAAG,EAAA;AAC1C,IAAA,IAAI,CAAC,mBAAA,CAAoB,YAAa,CAAA,QAAQ,CAAG,EAAA;AAC/C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAoB,iBAAA,EAAA,YAAA,CAAa,QAAQ,CAAA,gBAAA,EAAmB,aAAa,KAAK,CAAA,OAAA,CAAA;AAAA,OAChF,CAAA;AAAA,KACF;AAAA,GACF;AACA,EAAA,MAAM,cAAiB,GAAA,KAAA,CAAM,OAAQ,CAAA,YAAA,CAAa,KAAK,CAAA,GACnD,CAAI,CAAA,EAAA,YAAA,CAAa,KACd,CAAA,GAAA,CAAI,CAAK,CAAA,KAAA,WAAA,CAAY,YAAa,CAAA,KAAA,EAAO,CAAG,EAAA,QAAA,EAAU,IAAI,CAAC,CAC3D,CAAA,IAAA,CAAK,IAAI,CAAC,CACb,CAAA,CAAA,GAAA,WAAA,CAAY,YAAa,CAAA,KAAA,EAAO,YAAa,CAAA,KAAA,EAAO,UAAU,IAAI,CAAA,CAAA;AACtE,EAAO,OAAA,CAAA,EAAG,YAAa,CAAA,KAAK,CAAM,GAAA,EAAA,kBAAA;AAAA,IAChC,YAAa,CAAA,QAAA;AAAA,GACd,KAAK,cAAc,CAAA,CAAA,CAAA,CAAA;AACtB,CAAA;AAEgB,SAAA,oBAAA,CACd,aACA,EAAA,IAAA,EACA,OACQ,EAAA;AACR,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAO,OAAA,EAAA,CAAA;AAAA,GACT;AAEA,EAAI,IAAA,eAAA,CAAgB,OAAO,CAAG,EAAA;AAC5B,IAAO,OAAA,mBAAA,CAAoB,aAAe,EAAA,IAAA,EAAM,OAAO,CAAA,CAAA;AAAA,GACzD;AAEA,EAAA,IAAI,CAAC,mBAAA,CAAoB,OAAQ,CAAA,QAAQ,CAAG,EAAA;AAC1C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,wBAAwB,OAAQ,CAAA,QAAQ,8BAA8B,kBAAmB,CAAA,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,KACrG,CAAA;AAAA,GACF;AAEA,EAAA,MAAM,WAAW,aAAc,CAAA,IAAA,CAAK,OAAK,CAAE,CAAA,IAAA,KAAS,QAAQ,KAAK,CAAA,CAAA;AACjE,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAA,MAAM,IAAI,KAAA,CAAM,CAAqB,kBAAA,EAAA,OAAA,CAAQ,KAAK,CAAc,YAAA,CAAA,CAAA,CAAA;AAAA,GAClE;AAEA,EAAA,IAAI,CAAC,yBAA0B,CAAA,OAAA,CAAQ,QAAU,EAAA,QAAA,EAAU,IAAI,CAAG,EAAA;AAChE,IAAA,MAAM,mBAAmB,wBAAyB,CAAA,QAAA,CAAS,IAAK,CAAA,IAAI,KAAK,EAAC,CAAA;AAC1E,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAwB,qBAAA,EAAA,OAAA,CAAQ,QAAQ,CAAA,YAAA,EAAe,SAAS,IAAI,CAAA,WAAA,EAAc,QAAS,CAAA,IAAA,CAAK,IAAI,CAAA,0BAAA,EAA6B,gBAAiB,CAAA,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,KAC9J,CAAA;AAAA,GACF;AAEA,EAAA,QAAQ,QAAQ,QAAU;AAAA,IACxB,KAAKA,yDAAwB,CAAA,MAAA;AAC3B,MAAA,OAAO,qBAAqB,OAAO,CAAA,CAAA;AAAA,IACrC,KAAKA,yDAAwB,CAAA,OAAA;AAC3B,MAAA,OAAO,sBAAsB,OAAO,CAAA,CAAA;AAAA,IACtC,KAAKA,yDAAwB,CAAA,EAAA,CAAA;AAAA,IAC7B,KAAKA,yDAAwB,CAAA,IAAA,CAAA;AAAA,IAC7B,KAAKA,yDAAwB,CAAA,EAAA,CAAA;AAAA,IAC7B,KAAKA,yDAAwB,CAAA,EAAA,CAAA;AAAA,IAC7B,KAAKA,yDAAwB,CAAA,GAAA,CAAA;AAAA,IAC7B,KAAKA,yDAAwB,CAAA,EAAA,CAAA;AAAA,IAC7B,KAAKA,yDAAwB,CAAA,GAAA;AAC3B,MAAO,OAAA,oBAAA,CAAqB,OAAS,EAAA,QAAA,EAAU,IAAI,CAAA,CAAA;AAAA,IAErD;AACE,MAAM,MAAA,IAAI,MAAM,CAA8B,4BAAA,CAAA,CAAA,CAAA;AAAA,GAClD;AACF,CAAA;AAEA,SAAS,oBAAoB,QAA4C,EAAA;AACvE,EAAO,OAAA,kBAAA,CAAmB,SAAS,QAAQ,CAAA,CAAA;AAC7C,CAAA;AAEA,SAAS,uBAAuB,QAAuC,EAAA;AACrE,EAAO,OAAA,QAAA,EAAU,IAAK,CAAA,IAAA,KAASC,0CAAS,CAAA,MAAA,CAAA;AAC1C,CAAA;AAEgB,SAAA,yBAAA,CACd,QACA,EAAA,QAAA,EACA,IACS,EAAA;AACT,EAAA,IAAI,aAAa,QAAS,CAAA,IAAA,EAAM,IAAI,CAAK,IAAA,mBAAA,CAAoB,QAAQ,CAAG,EAAA;AACtE,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,cAAiB,GAAA,wBAAA,CAAyB,QAAS,CAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAClE,EAAA,OAAO,cAAiB,GAAA,cAAA,CAAe,QAAS,CAAA,QAAQ,CAAI,GAAA,KAAA,CAAA;AAC9D,CAAA;AAEA,SAAS,iBAAiB,KAAqB,EAAA;AAC7C,EAAI,IAAA,OAAO,UAAU,SAAW,EAAA;AAC9B,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AACA,EAAI,IAAA,OAAO,UAAU,QAAU,EAAA;AAC7B,IAAO,OAAA,KAAA,CAAM,aAAkB,KAAA,MAAA,CAAA;AAAA,GACjC;AACA,EAAI,IAAA,OAAO,UAAU,QAAU,EAAA;AAC7B,IAAA,OAAO,KAAU,KAAA,CAAA,CAAA;AAAA,GACnB;AACA,EAAO,OAAA,KAAA,CAAA;AACT,CAAA;AAEA,SAAS,WACP,CAAA,SAAA,EACA,UACA,EAAA,QAAA,EACA,IACQ,EAAA;AACR,EAAA,IAAI,CAAC,sBAAwB,EAAA;AAC3B,IAAA,MAAM,IAAI,KAAM,CAAA,CAAA,uBAAA,EAA0B,QAAS,CAAA,IAAA,CAAK,IAAI,CAAE,CAAA,CAAA,CAAA;AAAA,GAChE;AAEA,EAAI,IAAA,YAAA,CAAa,SAAW,EAAA,IAAI,CAAG,EAAA;AACjC,IAAA,OAAO,GAAG,UAAU,CAAA,CAAA,CAAA;AAAA,GACtB;AACA,EAAA,IACE,QAAS,CAAA,IAAA,CAAK,IAAS,KAAAA,0CAAA,CAAS,UAChC,QAAS,CAAA,IAAA,CAAK,IAAS,KAAAA,0CAAA,CAAS,EAChC,IAAA,QAAA,CAAS,IAAK,CAAA,IAAA,KAASA,2CAAS,IAChC,EAAA;AACA,IAAA,OAAO,IAAI,UAAU,CAAA,CAAA,CAAA,CAAA;AAAA,GACvB;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,8BAA8B,SAAS,CAAA,CAAA,EAAI,UAAU,CAAc,WAAA,EAAA,QAAA,CAAS,KAAK,IAAI,CAAA,CAAA;AAAA,GACvF,CAAA;AACF,CAAA;AAEA,SAAS,mBAAmB,QAA2C,EAAA;AACrE,EAAA,QAAQ,QAAU;AAAA,IAChB,KAAK,IAAA;AACH,MAAO,OAAA,OAAA,CAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAO,OAAA,MAAA,CAAA;AAAA,IACT,KAAK,IAAA;AACH,MAAO,OAAA,IAAA,CAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAO,OAAA,QAAA,CAAA;AAAA,IACT,KAAK,IAAA;AACH,MAAO,OAAA,aAAA,CAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAO,OAAA,kBAAA,CAAA;AAAA,IACT,KAAK,IAAA;AACH,MAAO,OAAA,UAAA,CAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAO,OAAA,eAAA,CAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAO,OAAA,SAAA,CAAA;AAAA,IACT;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAc,WAAA,EAAA,QAAQ,CAAiB,eAAA,CAAA,CAAA,CAAA;AAAA,GAC3D;AACF;;;;;"}
@@ -62,10 +62,10 @@ class DataIndexService {
62
62
  async inspectInputArgument(type) {
63
63
  const result = await this.client.query(this.graphQLArgumentQuery(type), {});
64
64
  this.logger.debug(`Introspection query result: ${JSON.stringify(result)}`);
65
- if (result?.error) {
66
- this.logger.error(`Error executing introspection query ${result.error}`);
67
- throw result.error;
68
- }
65
+ this.handleGraphqlClientError(
66
+ "Error executing introspection query",
67
+ result
68
+ );
69
69
  const pairs = [];
70
70
  if (result?.data?.__type?.inputFields) {
71
71
  for (const field of result.data.__type.inputFields) {
@@ -83,37 +83,13 @@ class DataIndexService {
83
83
  }
84
84
  return pairs;
85
85
  }
86
- async abortWorkflowInstance(instanceId) {
87
- this.logger.info(`Aborting workflow instance ${instanceId}`);
88
- const ProcessInstanceAbortMutationDocument = core.gql`
89
- mutation ProcessInstanceAbortMutation($id: String) {
90
- ProcessInstanceAbort(id: $id)
91
- }
92
- `;
93
- const result = await this.client.mutation(
94
- ProcessInstanceAbortMutationDocument,
95
- { id: instanceId }
96
- );
97
- this.logger.debug(
98
- `Abort workflow instance result: ${JSON.stringify(result)}`
99
- );
100
- if (result.error) {
101
- throw new Error(
102
- `Error aborting workflow instance ${instanceId}: ${result.error}`
103
- );
104
- }
105
- this.logger.debug(`Successfully aborted workflow instance ${instanceId}`);
106
- }
107
86
  async fetchWorkflowInfo(definitionId) {
108
87
  const graphQlQuery = `{ ProcessDefinitions ( where: {id: {equal: "${definitionId}" } } ) { id, name, version, type, endpoint, serviceUrl, source } }`;
109
88
  const result = await this.client.query(graphQlQuery, {});
110
89
  this.logger.debug(
111
90
  `Get workflow definition result: ${JSON.stringify(result)}`
112
91
  );
113
- if (result.error) {
114
- this.logger.error(`Error fetching workflow definition ${result.error}`);
115
- throw result.error;
116
- }
92
+ this.handleGraphqlClientError("Error fetching workflow definition", result);
117
93
  const processDefinitions = result.data.ProcessDefinitions;
118
94
  if (processDefinitions.length === 0) {
119
95
  this.logger.info(`No workflow definition found for ${definitionId}`);
@@ -127,10 +103,10 @@ class DataIndexService {
127
103
  this.logger.debug(
128
104
  `Get workflow service urls result: ${JSON.stringify(result)}`
129
105
  );
130
- if (result.error) {
131
- this.logger.error(`Error fetching workflow service urls ${result.error}`);
132
- throw result.error;
133
- }
106
+ this.handleGraphqlClientError(
107
+ "Error fetching workflow service urls",
108
+ result
109
+ );
134
110
  const processDefinitions = result.data.ProcessDefinitions;
135
111
  return processDefinitions.filter((definition) => definition.serviceUrl).map((definition) => ({ [definition.id]: definition.serviceUrl })).reduce((acc, curr) => ({ ...acc, ...curr }), {});
136
112
  }
@@ -162,12 +138,10 @@ class DataIndexService {
162
138
  this.logger.debug(
163
139
  `Get workflow definitions result: ${JSON.stringify(result)}`
164
140
  );
165
- if (result.error) {
166
- this.logger.error(
167
- `Error fetching data index swf results ${result.error}`
168
- );
169
- throw result.error;
170
- }
141
+ this.handleGraphqlClientError(
142
+ "Error fetching data index swf results",
143
+ result
144
+ );
171
145
  return result.data.ProcessDefinitions;
172
146
  }
173
147
  async fetchInstances(args) {
@@ -210,10 +184,7 @@ class DataIndexService {
210
184
  this.logger.debug(
211
185
  `Fetch process instances result: ${JSON.stringify(result)}`
212
186
  );
213
- if (result.error) {
214
- this.logger.error(`Error when fetching instances: ${result.error}`);
215
- throw result.error;
216
- }
187
+ this.handleGraphqlClientError("Error when fetching instances", result);
217
188
  const processInstancesSrc = result.data ? result.data.ProcessInstances : [];
218
189
  const processInstances = await Promise.all(
219
190
  processInstancesSrc.map(async (instance) => {
@@ -244,10 +215,10 @@ class DataIndexService {
244
215
  this.logger.debug(
245
216
  `Fetch workflow source result: ${JSON.stringify(result)}`
246
217
  );
247
- if (result.error) {
248
- this.logger.error(`Error when fetching workflow source: ${result.error}`);
249
- return void 0;
250
- }
218
+ this.handleGraphqlClientError(
219
+ "Error when fetching workflow source",
220
+ result
221
+ );
251
222
  const processDefinitions = result.data.ProcessDefinitions;
252
223
  if (processDefinitions.length === 0) {
253
224
  this.logger.info(`No workflow source found for ${definitionId}`);
@@ -261,12 +232,10 @@ class DataIndexService {
261
232
  this.logger.debug(
262
233
  `Fetch workflow instances result: ${JSON.stringify(result)}`
263
234
  );
264
- if (result.error) {
265
- this.logger.error(
266
- `Error when fetching workflow instances: ${result.error}`
267
- );
268
- throw result.error;
269
- }
235
+ this.handleGraphqlClientError(
236
+ "Error when fetching workflow instances",
237
+ result
238
+ );
270
239
  return result.data.ProcessInstances;
271
240
  }
272
241
  async fetchInstanceVariables(instanceId) {
@@ -275,12 +244,10 @@ class DataIndexService {
275
244
  this.logger.debug(
276
245
  `Fetch process instance variables result: ${JSON.stringify(result)}`
277
246
  );
278
- if (result.error) {
279
- this.logger.error(
280
- `Error when fetching process instance variables: ${result.error}`
281
- );
282
- throw result.error;
283
- }
247
+ this.handleGraphqlClientError(
248
+ "Error when fetching process instance variables",
249
+ result
250
+ );
284
251
  const processInstances = result.data.ProcessInstances;
285
252
  if (processInstances.length === 0) {
286
253
  return void 0;
@@ -293,12 +260,10 @@ class DataIndexService {
293
260
  this.logger.debug(
294
261
  `Fetch process id from instance result: ${JSON.stringify(result)}`
295
262
  );
296
- if (result.error) {
297
- this.logger.error(
298
- `Error when fetching process id from instance: ${result.error}`
299
- );
300
- throw result.error;
301
- }
263
+ this.handleGraphqlClientError(
264
+ "Error when fetching process id from instance",
265
+ result
266
+ );
302
267
  const processInstances = result.data.ProcessInstances;
303
268
  if (processInstances.length === 0) {
304
269
  return void 0;
@@ -345,12 +310,10 @@ class DataIndexService {
345
310
  this.logger.debug(
346
311
  `Fetch process instance result: ${JSON.stringify(result)}`
347
312
  );
348
- if (result.error) {
349
- this.logger.error(
350
- `Error when fetching process instances: ${result.error}`
351
- );
352
- throw result.error;
353
- }
313
+ this.handleGraphqlClientError(
314
+ "Error when fetching process instances",
315
+ result
316
+ );
354
317
  const processInstances = result.data.ProcessInstances;
355
318
  if (processInstances.length === 0) {
356
319
  return void 0;
@@ -371,6 +334,20 @@ class DataIndexService {
371
334
  }
372
335
  return instance;
373
336
  }
337
+ handleGraphqlClientError(scenario, result) {
338
+ if (!result?.error) {
339
+ return;
340
+ }
341
+ this.logger.error(`${scenario} ${result}`);
342
+ const networkError = result.error.networkError?.cause?.message;
343
+ if (networkError) {
344
+ const toThrow = new Error(`${result.error.message}. ${networkError}`);
345
+ toThrow.name = "Network Error";
346
+ throw toThrow;
347
+ } else {
348
+ throw result.error;
349
+ }
350
+ }
374
351
  }
375
352
 
376
353
  exports.DataIndexService = DataIndexService;
@@ -1 +1 @@
1
- {"version":3,"file":"DataIndexService.cjs.js","sources":["../../src/service/DataIndexService.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 { LoggerService } from '@backstage/backend-plugin-api';\n\nimport { Client, fetchExchange, gql } from '@urql/core';\n\nimport {\n Filter,\n fromWorkflowSource,\n getWorkflowCategory,\n IntrospectionField,\n parseWorkflowVariables,\n ProcessInstance,\n WorkflowDefinition,\n WorkflowInfo,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { ErrorBuilder } from '../helpers/errorBuilder';\nimport { buildFilterCondition } from '../helpers/filterBuilder';\nimport { buildGraphQlQuery } from '../helpers/queryBuilder';\nimport { Pagination } from '../types/pagination';\nimport { FETCH_PROCESS_INSTANCES_SORT_FIELD } from './constants';\n\nexport class DataIndexService {\n private readonly client: Client;\n public processDefinitionArguments: IntrospectionField[] = [];\n public processInstanceArguments: IntrospectionField[] = [];\n\n public constructor(\n private readonly dataIndexUrl: string,\n private readonly logger: LoggerService,\n ) {\n if (!dataIndexUrl.length) {\n throw ErrorBuilder.GET_NO_DATA_INDEX_URL_ERR();\n }\n\n this.client = this.getNewGraphQLClient();\n }\n\n private getNewGraphQLClient(): Client {\n const diURL = `${this.dataIndexUrl}/graphql`;\n return new Client({\n url: diURL,\n exchanges: [fetchExchange],\n });\n }\n\n public async initInputProcessDefinitionArgs(): Promise<IntrospectionField[]> {\n if (this.processDefinitionArguments.length === 0) {\n this.processDefinitionArguments =\n await this.inspectInputArgument('ProcessDefinition');\n }\n return this.processDefinitionArguments; // For testing purposes\n }\n\n public graphQLArgumentQuery(type: string): string {\n return `query ${type}Argument {\n __type(name: \"${type}Argument\") {\n kind\n name\n inputFields {\n name\n type {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n }\n }\n }\n }\n }\n }\n }`;\n }\n\n public async inspectInputArgument(\n type: string,\n ): Promise<IntrospectionField[]> {\n const result = await this.client.query(this.graphQLArgumentQuery(type), {});\n\n this.logger.debug(`Introspection query result: ${JSON.stringify(result)}`);\n\n if (result?.error) {\n this.logger.error(`Error executing introspection query ${result.error}`);\n throw result.error;\n }\n\n const pairs: IntrospectionField[] = [];\n if (result?.data?.__type?.inputFields) {\n for (const field of result.data.__type.inputFields) {\n if (\n field.name !== 'and' &&\n field.name !== 'or' &&\n field.name !== 'not'\n ) {\n pairs.push({\n name: field.name,\n type: {\n name: field.type.name,\n kind: field.type.kind,\n ofType: field.type.ofType,\n },\n });\n }\n }\n }\n return pairs;\n }\n\n public async abortWorkflowInstance(instanceId: string): Promise<void> {\n this.logger.info(`Aborting workflow instance ${instanceId}`);\n const ProcessInstanceAbortMutationDocument = gql`\n mutation ProcessInstanceAbortMutation($id: String) {\n ProcessInstanceAbort(id: $id)\n }\n `;\n\n const result = await this.client.mutation(\n ProcessInstanceAbortMutationDocument,\n { id: instanceId },\n );\n\n this.logger.debug(\n `Abort workflow instance result: ${JSON.stringify(result)}`,\n );\n\n if (result.error) {\n throw new Error(\n `Error aborting workflow instance ${instanceId}: ${result.error}`,\n );\n }\n this.logger.debug(`Successfully aborted workflow instance ${instanceId}`);\n }\n\n public async fetchWorkflowInfo(\n definitionId: string,\n ): Promise<WorkflowInfo | undefined> {\n const graphQlQuery = `{ ProcessDefinitions ( where: {id: {equal: \"${definitionId}\" } } ) { id, name, version, type, endpoint, serviceUrl, source } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Get workflow definition result: ${JSON.stringify(result)}`,\n );\n\n if (result.error) {\n this.logger.error(`Error fetching workflow definition ${result.error}`);\n throw result.error;\n }\n\n const processDefinitions = result.data.ProcessDefinitions as WorkflowInfo[];\n\n if (processDefinitions.length === 0) {\n this.logger.info(`No workflow definition found for ${definitionId}`);\n return undefined;\n }\n\n return processDefinitions[0];\n }\n\n public async fetchWorkflowServiceUrls(): Promise<Record<string, string>> {\n const graphQlQuery = `{ ProcessDefinitions { id, serviceUrl } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Get workflow service urls result: ${JSON.stringify(result)}`,\n );\n\n if (result.error) {\n this.logger.error(`Error fetching workflow service urls ${result.error}`);\n throw result.error;\n }\n\n const processDefinitions = result.data.ProcessDefinitions as WorkflowInfo[];\n return processDefinitions\n .filter(definition => definition.serviceUrl)\n .map(definition => ({ [definition.id]: definition.serviceUrl! }))\n .reduce((acc, curr) => ({ ...acc, ...curr }), {});\n }\n\n public async fetchWorkflowInfos(args: {\n definitionIds?: string[];\n pagination?: Pagination;\n filter?: Filter;\n }): Promise<WorkflowInfo[]> {\n this.logger.info(`fetchWorkflowInfos() called: ${this.dataIndexUrl}`);\n const { definitionIds, pagination, filter } = args;\n\n const definitionIdsCondition =\n definitionIds !== undefined && definitionIds.length > 0\n ? `id: {in: ${JSON.stringify(definitionIds)}}`\n : undefined;\n\n const filterCondition = filter\n ? buildFilterCondition(\n await this.initInputProcessDefinitionArgs(),\n 'ProcessDefinition',\n filter,\n )\n : undefined;\n\n let whereClause: string | undefined;\n if (definitionIds && filter) {\n whereClause = `and: [{${definitionIdsCondition}}, {${filterCondition}}]`;\n } else if (definitionIdsCondition || filterCondition) {\n whereClause = definitionIdsCondition ?? filterCondition;\n } else {\n whereClause = undefined;\n }\n\n const graphQlQuery = buildGraphQlQuery({\n type: 'ProcessDefinitions',\n queryBody: 'id, name, version, type, endpoint, serviceUrl, source',\n whereClause,\n pagination,\n });\n this.logger.debug(`GraphQL query: ${graphQlQuery}`);\n const result = await this.client.query(graphQlQuery, {});\n this.logger.debug(\n `Get workflow definitions result: ${JSON.stringify(result)}`,\n );\n\n if (result.error) {\n this.logger.error(\n `Error fetching data index swf results ${result.error}`,\n );\n throw result.error;\n }\n\n return result.data.ProcessDefinitions;\n }\n\n public async fetchInstances(args: {\n definitionIds?: string[];\n pagination?: Pagination;\n filter?: Filter;\n }): Promise<ProcessInstance[]> {\n const { pagination, definitionIds, filter } = args;\n if (pagination) pagination.sortField ??= FETCH_PROCESS_INSTANCES_SORT_FIELD;\n\n const processIdNotNullCondition = 'processId: {isNull: false}';\n const definitionIdsCondition = definitionIds\n ? `processId: {in: ${JSON.stringify(definitionIds)}}`\n : undefined;\n const type = 'ProcessInstance';\n const filterCondition = filter\n ? buildFilterCondition(\n await this.inspectInputArgument(type),\n type,\n filter,\n )\n : '';\n\n let whereClause = '';\n const conditions = [];\n\n if (processIdNotNullCondition) {\n conditions.push(`{${processIdNotNullCondition}}`);\n }\n\n if (definitionIdsCondition) {\n conditions.push(`{${definitionIdsCondition}}`);\n }\n\n if (filter) {\n conditions.push(`{${filterCondition}}`);\n }\n\n if (conditions.length === 0) {\n whereClause = processIdNotNullCondition;\n } else if (conditions.length === 1) {\n whereClause = conditions[0].slice(1, -1); // Remove the outer braces\n } else if (conditions.length > 1) {\n whereClause = `and: [${conditions.join(', ')}]`;\n }\n\n const graphQlQuery = buildGraphQlQuery({\n type: 'ProcessInstances',\n queryBody:\n 'id, processName, processId, businessKey, state, start, end, nodes { id }, variables, parentProcessInstance {id, processName, businessKey}',\n whereClause,\n pagination,\n });\n\n this.logger.debug(`GraphQL query: ${graphQlQuery}`);\n\n const result = await this.client.query<{\n ProcessInstances: ProcessInstance[];\n }>(graphQlQuery, {});\n this.logger.debug(\n `Fetch process instances result: ${JSON.stringify(result)}`,\n );\n if (result.error) {\n this.logger.error(`Error when fetching instances: ${result.error}`);\n throw result.error;\n }\n const processInstancesSrc = result.data ? result.data.ProcessInstances : [];\n\n const processInstances = await Promise.all(\n processInstancesSrc.map(async instance => {\n return await this.getWorkflowDefinitionFromInstance(instance);\n }),\n );\n return processInstances;\n }\n\n private async getWorkflowDefinitionFromInstance(instance: ProcessInstance) {\n const workflowInfo = await this.fetchWorkflowInfo(instance.processId);\n if (!workflowInfo?.source) {\n throw new Error(\n `Workflow defintion is required to fetch instance ${instance.id}`,\n );\n }\n const workflowDefinitionSrc: WorkflowDefinition = fromWorkflowSource(\n workflowInfo.source,\n );\n if (workflowInfo) {\n instance.category = getWorkflowCategory(workflowDefinitionSrc);\n instance.description = workflowInfo.description;\n }\n return instance;\n }\n\n public async fetchWorkflowSource(\n definitionId: string,\n ): Promise<string | undefined> {\n const graphQlQuery = `{ ProcessDefinitions ( where: {id: {equal: \"${definitionId}\" } } ) { id, source } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Fetch workflow source result: ${JSON.stringify(result)}`,\n );\n\n if (result.error) {\n this.logger.error(`Error when fetching workflow source: ${result.error}`);\n return undefined;\n }\n\n const processDefinitions = result.data.ProcessDefinitions as WorkflowInfo[];\n\n if (processDefinitions.length === 0) {\n this.logger.info(`No workflow source found for ${definitionId}`);\n return undefined;\n }\n\n return processDefinitions[0].source;\n }\n\n public async fetchInstancesByDefinitionId(args: {\n definitionId: string;\n limit: number;\n offset: number;\n }): Promise<ProcessInstance[]> {\n const graphQlQuery = `{ ProcessInstances(where: {processId: {equal: \"${args.definitionId}\" } }, orderBy: {start:DESC}, pagination: {limit: ${args.limit}, offset: ${args.offset}}) { id, processName, state, start, end } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Fetch workflow instances result: ${JSON.stringify(result)}`,\n );\n\n if (result.error) {\n this.logger.error(\n `Error when fetching workflow instances: ${result.error}`,\n );\n throw result.error;\n }\n\n return result.data.ProcessInstances;\n }\n\n public async fetchInstanceVariables(\n instanceId: string,\n ): Promise<object | undefined> {\n const graphQlQuery = `{ ProcessInstances (where: { id: {equal: \"${instanceId}\" } } ) { variables } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Fetch process instance variables result: ${JSON.stringify(result)}`,\n );\n\n if (result.error) {\n this.logger.error(\n `Error when fetching process instance variables: ${result.error}`,\n );\n throw result.error;\n }\n\n const processInstances = result.data.ProcessInstances as ProcessInstance[];\n\n if (processInstances.length === 0) {\n return undefined;\n }\n\n return parseWorkflowVariables(processInstances[0].variables as object);\n }\n\n public async fetchDefinitionIdByInstanceId(\n instanceId: string,\n ): Promise<string | undefined> {\n const graphQlQuery = `{ ProcessInstances (where: { id: {equal: \"${instanceId}\" } } ) { processId } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Fetch process id from instance result: ${JSON.stringify(result)}`,\n );\n\n if (result.error) {\n this.logger.error(\n `Error when fetching process id from instance: ${result.error}`,\n );\n throw result.error;\n }\n\n const processInstances = result.data.ProcessInstances as ProcessInstance[];\n\n if (processInstances.length === 0) {\n return undefined;\n }\n\n return processInstances[0].processId;\n }\n\n public async fetchInstance(\n instanceId: string,\n ): Promise<ProcessInstance | undefined> {\n const FindProcessInstanceQuery = gql`\n query FindProcessInstanceQuery($instanceId: String!) {\n ProcessInstances(where: { id: { equal: $instanceId } }) {\n id\n processName\n processId\n serviceUrl\n businessKey\n state\n start\n end\n nodes {\n id\n nodeId\n definitionId\n type\n name\n enter\n exit\n }\n variables\n parentProcessInstance {\n id\n processName\n businessKey\n }\n error {\n nodeDefinitionId\n message\n }\n }\n }\n `;\n\n const result = await this.client.query(FindProcessInstanceQuery, {\n instanceId,\n });\n\n this.logger.debug(\n `Fetch process instance result: ${JSON.stringify(result)}`,\n );\n\n if (result.error) {\n this.logger.error(\n `Error when fetching process instances: ${result.error}`,\n );\n throw result.error;\n }\n\n const processInstances = result.data.ProcessInstances as ProcessInstance[];\n\n if (processInstances.length === 0) {\n return undefined;\n }\n\n const instance = processInstances[0];\n\n const workflowInfo = await this.fetchWorkflowInfo(instance.processId);\n if (!workflowInfo?.source) {\n throw new Error(\n `Workflow defintion is required to fetch instance ${instance.id}`,\n );\n }\n const workflowDefinitionSrc: WorkflowDefinition = fromWorkflowSource(\n workflowInfo.source,\n );\n if (workflowInfo) {\n instance.category = getWorkflowCategory(workflowDefinitionSrc);\n instance.description = workflowDefinitionSrc.description;\n }\n return instance;\n }\n}\n"],"names":["ErrorBuilder","Client","fetchExchange","gql","buildFilterCondition","buildGraphQlQuery","FETCH_PROCESS_INSTANCES_SORT_FIELD","fromWorkflowSource","getWorkflowCategory","parseWorkflowVariables"],"mappings":"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"}
1
+ {"version":3,"file":"DataIndexService.cjs.js","sources":["../../src/service/DataIndexService.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 { LoggerService } from '@backstage/backend-plugin-api';\n\nimport { Client, fetchExchange, gql } from '@urql/core';\n\nimport {\n Filter,\n fromWorkflowSource,\n getWorkflowCategory,\n IntrospectionField,\n parseWorkflowVariables,\n ProcessInstance,\n WorkflowDefinition,\n WorkflowInfo,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { ErrorBuilder } from '../helpers/errorBuilder';\nimport { buildFilterCondition } from '../helpers/filterBuilder';\nimport { buildGraphQlQuery } from '../helpers/queryBuilder';\nimport { Pagination } from '../types/pagination';\nimport { FETCH_PROCESS_INSTANCES_SORT_FIELD } from './constants';\n\nexport class DataIndexService {\n private readonly client: Client;\n public processDefinitionArguments: IntrospectionField[] = [];\n public processInstanceArguments: IntrospectionField[] = [];\n\n public constructor(\n private readonly dataIndexUrl: string,\n private readonly logger: LoggerService,\n ) {\n if (!dataIndexUrl.length) {\n throw ErrorBuilder.GET_NO_DATA_INDEX_URL_ERR();\n }\n\n this.client = this.getNewGraphQLClient();\n }\n\n private getNewGraphQLClient(): Client {\n const diURL = `${this.dataIndexUrl}/graphql`;\n return new Client({\n url: diURL,\n exchanges: [fetchExchange],\n });\n }\n\n public async initInputProcessDefinitionArgs(): Promise<IntrospectionField[]> {\n if (this.processDefinitionArguments.length === 0) {\n this.processDefinitionArguments =\n await this.inspectInputArgument('ProcessDefinition');\n }\n return this.processDefinitionArguments; // For testing purposes\n }\n\n public graphQLArgumentQuery(type: string): string {\n return `query ${type}Argument {\n __type(name: \"${type}Argument\") {\n kind\n name\n inputFields {\n name\n type {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n }\n }\n }\n }\n }\n }\n }`;\n }\n\n public async inspectInputArgument(\n type: string,\n ): Promise<IntrospectionField[]> {\n const result = await this.client.query(this.graphQLArgumentQuery(type), {});\n\n this.logger.debug(`Introspection query result: ${JSON.stringify(result)}`);\n\n this.handleGraphqlClientError(\n 'Error executing introspection query',\n result,\n );\n\n const pairs: IntrospectionField[] = [];\n if (result?.data?.__type?.inputFields) {\n for (const field of result.data.__type.inputFields) {\n if (\n field.name !== 'and' &&\n field.name !== 'or' &&\n field.name !== 'not'\n ) {\n pairs.push({\n name: field.name,\n type: {\n name: field.type.name,\n kind: field.type.kind,\n ofType: field.type.ofType,\n },\n });\n }\n }\n }\n return pairs;\n }\n\n public async fetchWorkflowInfo(\n definitionId: string,\n ): Promise<WorkflowInfo | undefined> {\n const graphQlQuery = `{ ProcessDefinitions ( where: {id: {equal: \"${definitionId}\" } } ) { id, name, version, type, endpoint, serviceUrl, source } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Get workflow definition result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError('Error fetching workflow definition', result);\n\n const processDefinitions = result.data.ProcessDefinitions as WorkflowInfo[];\n\n if (processDefinitions.length === 0) {\n this.logger.info(`No workflow definition found for ${definitionId}`);\n return undefined;\n }\n\n return processDefinitions[0];\n }\n\n public async fetchWorkflowServiceUrls(): Promise<Record<string, string>> {\n const graphQlQuery = `{ ProcessDefinitions { id, serviceUrl } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Get workflow service urls result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error fetching workflow service urls',\n result,\n );\n\n const processDefinitions = result.data.ProcessDefinitions as WorkflowInfo[];\n return processDefinitions\n .filter(definition => definition.serviceUrl)\n .map(definition => ({ [definition.id]: definition.serviceUrl! }))\n .reduce((acc, curr) => ({ ...acc, ...curr }), {});\n }\n\n public async fetchWorkflowInfos(args: {\n definitionIds?: string[];\n pagination?: Pagination;\n filter?: Filter;\n }): Promise<WorkflowInfo[]> {\n this.logger.info(`fetchWorkflowInfos() called: ${this.dataIndexUrl}`);\n const { definitionIds, pagination, filter } = args;\n\n const definitionIdsCondition =\n definitionIds !== undefined && definitionIds.length > 0\n ? `id: {in: ${JSON.stringify(definitionIds)}}`\n : undefined;\n\n const filterCondition = filter\n ? buildFilterCondition(\n await this.initInputProcessDefinitionArgs(),\n 'ProcessDefinition',\n filter,\n )\n : undefined;\n\n let whereClause: string | undefined;\n if (definitionIds && filter) {\n whereClause = `and: [{${definitionIdsCondition}}, {${filterCondition}}]`;\n } else if (definitionIdsCondition || filterCondition) {\n whereClause = definitionIdsCondition ?? filterCondition;\n } else {\n whereClause = undefined;\n }\n\n const graphQlQuery = buildGraphQlQuery({\n type: 'ProcessDefinitions',\n queryBody: 'id, name, version, type, endpoint, serviceUrl, source',\n whereClause,\n pagination,\n });\n this.logger.debug(`GraphQL query: ${graphQlQuery}`);\n const result = await this.client.query(graphQlQuery, {});\n this.logger.debug(\n `Get workflow definitions result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error fetching data index swf results',\n result,\n );\n\n return result.data.ProcessDefinitions;\n }\n\n public async fetchInstances(args: {\n definitionIds?: string[];\n pagination?: Pagination;\n filter?: Filter;\n }): Promise<ProcessInstance[]> {\n const { pagination, definitionIds, filter } = args;\n if (pagination) pagination.sortField ??= FETCH_PROCESS_INSTANCES_SORT_FIELD;\n\n const processIdNotNullCondition = 'processId: {isNull: false}';\n const definitionIdsCondition = definitionIds\n ? `processId: {in: ${JSON.stringify(definitionIds)}}`\n : undefined;\n const type = 'ProcessInstance';\n const filterCondition = filter\n ? buildFilterCondition(\n await this.inspectInputArgument(type),\n type,\n filter,\n )\n : '';\n\n let whereClause = '';\n const conditions = [];\n\n if (processIdNotNullCondition) {\n conditions.push(`{${processIdNotNullCondition}}`);\n }\n\n if (definitionIdsCondition) {\n conditions.push(`{${definitionIdsCondition}}`);\n }\n\n if (filter) {\n conditions.push(`{${filterCondition}}`);\n }\n\n if (conditions.length === 0) {\n whereClause = processIdNotNullCondition;\n } else if (conditions.length === 1) {\n whereClause = conditions[0].slice(1, -1); // Remove the outer braces\n } else if (conditions.length > 1) {\n whereClause = `and: [${conditions.join(', ')}]`;\n }\n\n const graphQlQuery = buildGraphQlQuery({\n type: 'ProcessInstances',\n queryBody:\n 'id, processName, processId, businessKey, state, start, end, nodes { id }, variables, parentProcessInstance {id, processName, businessKey}',\n whereClause,\n pagination,\n });\n\n this.logger.debug(`GraphQL query: ${graphQlQuery}`);\n\n const result = await this.client.query<{\n ProcessInstances: ProcessInstance[];\n }>(graphQlQuery, {});\n this.logger.debug(\n `Fetch process instances result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError('Error when fetching instances', result);\n\n const processInstancesSrc = result.data ? result.data.ProcessInstances : [];\n\n const processInstances = await Promise.all(\n processInstancesSrc.map(async instance => {\n return await this.getWorkflowDefinitionFromInstance(instance);\n }),\n );\n return processInstances;\n }\n\n private async getWorkflowDefinitionFromInstance(instance: ProcessInstance) {\n const workflowInfo = await this.fetchWorkflowInfo(instance.processId);\n if (!workflowInfo?.source) {\n throw new Error(\n `Workflow defintion is required to fetch instance ${instance.id}`,\n );\n }\n const workflowDefinitionSrc: WorkflowDefinition = fromWorkflowSource(\n workflowInfo.source,\n );\n if (workflowInfo) {\n instance.category = getWorkflowCategory(workflowDefinitionSrc);\n instance.description = workflowInfo.description;\n }\n return instance;\n }\n\n public async fetchWorkflowSource(\n definitionId: string,\n ): Promise<string | undefined> {\n const graphQlQuery = `{ ProcessDefinitions ( where: {id: {equal: \"${definitionId}\" } } ) { id, source } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Fetch workflow source result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching workflow source',\n result,\n );\n\n const processDefinitions = result.data.ProcessDefinitions as WorkflowInfo[];\n\n if (processDefinitions.length === 0) {\n this.logger.info(`No workflow source found for ${definitionId}`);\n return undefined;\n }\n\n return processDefinitions[0].source;\n }\n\n public async fetchInstancesByDefinitionId(args: {\n definitionId: string;\n limit: number;\n offset: number;\n }): Promise<ProcessInstance[]> {\n const graphQlQuery = `{ ProcessInstances(where: {processId: {equal: \"${args.definitionId}\" } }, orderBy: {start:DESC}, pagination: {limit: ${args.limit}, offset: ${args.offset}}) { id, processName, state, start, end } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Fetch workflow instances result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching workflow instances',\n result,\n );\n\n return result.data.ProcessInstances;\n }\n\n public async fetchInstanceVariables(\n instanceId: string,\n ): Promise<object | undefined> {\n const graphQlQuery = `{ ProcessInstances (where: { id: {equal: \"${instanceId}\" } } ) { variables } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Fetch process instance variables result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching process instance variables',\n result,\n );\n\n const processInstances = result.data.ProcessInstances as ProcessInstance[];\n\n if (processInstances.length === 0) {\n return undefined;\n }\n\n return parseWorkflowVariables(processInstances[0].variables as object);\n }\n\n public async fetchDefinitionIdByInstanceId(\n instanceId: string,\n ): Promise<string | undefined> {\n const graphQlQuery = `{ ProcessInstances (where: { id: {equal: \"${instanceId}\" } } ) { processId } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Fetch process id from instance result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching process id from instance',\n result,\n );\n\n const processInstances = result.data.ProcessInstances as ProcessInstance[];\n\n if (processInstances.length === 0) {\n return undefined;\n }\n\n return processInstances[0].processId;\n }\n\n public async fetchInstance(\n instanceId: string,\n ): Promise<ProcessInstance | undefined> {\n const FindProcessInstanceQuery = gql`\n query FindProcessInstanceQuery($instanceId: String!) {\n ProcessInstances(where: { id: { equal: $instanceId } }) {\n id\n processName\n processId\n serviceUrl\n businessKey\n state\n start\n end\n nodes {\n id\n nodeId\n definitionId\n type\n name\n enter\n exit\n }\n variables\n parentProcessInstance {\n id\n processName\n businessKey\n }\n error {\n nodeDefinitionId\n message\n }\n }\n }\n `;\n\n const result = await this.client.query(FindProcessInstanceQuery, {\n instanceId,\n });\n\n this.logger.debug(\n `Fetch process instance result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching process instances',\n result,\n );\n\n const processInstances = result.data.ProcessInstances as ProcessInstance[];\n\n if (processInstances.length === 0) {\n return undefined;\n }\n\n const instance = processInstances[0];\n\n const workflowInfo = await this.fetchWorkflowInfo(instance.processId);\n if (!workflowInfo?.source) {\n throw new Error(\n `Workflow defintion is required to fetch instance ${instance.id}`,\n );\n }\n const workflowDefinitionSrc: WorkflowDefinition = fromWorkflowSource(\n workflowInfo.source,\n );\n if (workflowInfo) {\n instance.category = getWorkflowCategory(workflowDefinitionSrc);\n instance.description = workflowDefinitionSrc.description;\n }\n return instance;\n }\n\n private handleGraphqlClientError(scenario: string, result: any) {\n if (!result?.error) {\n return;\n }\n this.logger.error(`${scenario} ${result}`);\n const networkError = result.error.networkError?.cause?.message;\n if (networkError) {\n const toThrow = new Error(`${result.error.message}. ${networkError}`);\n toThrow.name = 'Network Error';\n throw toThrow;\n } else {\n throw result.error;\n }\n }\n}\n"],"names":["ErrorBuilder","Client","fetchExchange","buildFilterCondition","buildGraphQlQuery","FETCH_PROCESS_INSTANCES_SORT_FIELD","fromWorkflowSource","getWorkflowCategory","parseWorkflowVariables","gql"],"mappings":"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"}
@@ -12,6 +12,7 @@ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'defau
12
12
  var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
13
13
 
14
14
  const SONATA_FLOW_RESOURCES_PATH = "/home/kogito/serverless-workflow-project/src/main/resources";
15
+ const DEFAULT_SONATAFLOW_RUNTIME = "docker";
15
16
  class DevModeService {
16
17
  constructor(config, logger) {
17
18
  this.logger = logger;
@@ -78,8 +79,7 @@ class DevModeService {
78
79
  "run",
79
80
  "--name",
80
81
  "backstage-internal-sonataflow",
81
- "--add-host",
82
- "host.docker.internal:host-gateway"
82
+ ...this.connection.runtime === "podman" ? ["--replace"] : ["--add-host", "host.docker.internal:host-gateway"]
83
83
  ];
84
84
  launcherArgs.push("-e", `QUARKUS_HTTP_PORT=${this.connection.port}`);
85
85
  launcherArgs.push("-p", `${this.connection.port}:${this.connection.port}`);
@@ -88,14 +88,35 @@ class DevModeService {
88
88
  "-v",
89
89
  `${resourcesAbsPath}:${SONATA_FLOW_RESOURCES_PATH}:Z`
90
90
  );
91
+ if (this.connection?.persistencePath) {
92
+ const persistenceAbsPath = path.resolve(this.connection.persistencePath);
93
+ this.logger.info(
94
+ `Persistence is enabled, mounting ${persistenceAbsPath} as volume to persist data`
95
+ );
96
+ if (!fs__default.default.existsSync(persistenceAbsPath)) {
97
+ fs__default.default.mkdirSync(persistenceAbsPath, { recursive: true });
98
+ }
99
+ launcherArgs.push(
100
+ "-v",
101
+ `${persistenceAbsPath}:${backstagePluginOrchestratorCommon.DEFAULT_SONATAFLOW_PERSISTENCE_PATH}:Z`
102
+ );
103
+ }
91
104
  launcherArgs.push("-e", "KOGITO.CODEGEN.PROCESS.FAILONERROR=false");
92
105
  launcherArgs.push(
93
106
  "-e",
94
- `QUARKUS_EMBEDDED_POSTGRESQL_DATA_DIR=${this.connection.persistencePath}`
107
+ `QUARKUS_EMBEDDED_POSTGRESQL_DATA_DIR=${backstagePluginOrchestratorCommon.DEFAULT_SONATAFLOW_PERSISTENCE_PATH}`
108
+ );
109
+ launcherArgs.push(
110
+ "-e",
111
+ `NOTIFICATIONS_BEARER_TOKEN=${this.connection.notificationsBearerToken}`
112
+ );
113
+ launcherArgs.push(
114
+ "-e",
115
+ `BACKSTAGE_NOTIFICATIONS_URL=${this.connection.notificationsUrl}`
95
116
  );
96
117
  launcherArgs.push(this.connection.containerImage);
97
118
  return {
98
- command: "docker",
119
+ command: this.connection.runtime,
99
120
  args: launcherArgs
100
121
  };
101
122
  }
@@ -110,21 +131,31 @@ class DevModeService {
110
131
  const containerImage = config.getOptionalString("orchestrator.sonataFlowService.container") ?? backstagePluginOrchestratorCommon.DEFAULT_SONATAFLOW_CONTAINER_IMAGE;
111
132
  const persistencePath = config.getOptionalString(
112
133
  "orchestrator.sonataFlowService.persistence.path"
113
- ) ?? backstagePluginOrchestratorCommon.DEFAULT_SONATAFLOW_PERSISTENCE_PATH;
134
+ ) ?? "";
114
135
  const repoUrl = config.getOptionalString(
115
136
  "orchestrator.sonataFlowService.workflowsSource.gitRepositoryUrl"
116
137
  ) ?? "";
138
+ const notificationsBearerToken = config.getOptionalString(
139
+ "orchestrator.sonataFlowService.notificationsBearerToken"
140
+ ) ?? "";
141
+ const notificationsUrl = config.getOptionalString(
142
+ "orchestrator.sonataFlowService.notificationsUrl"
143
+ ) ?? "";
144
+ const runtime = config.getOptionalString("orchestrator.sonataFlowService.runtime") ?? DEFAULT_SONATAFLOW_RUNTIME;
117
145
  return {
146
+ runtime,
118
147
  host,
119
148
  port,
120
149
  containerImage,
121
150
  resourcesPath,
122
151
  persistencePath,
123
- repoUrl
152
+ repoUrl,
153
+ notificationsBearerToken,
154
+ notificationsUrl
124
155
  };
125
156
  }
126
157
  async loadDevWorkflows() {
127
- if (!this.connection.repoUrl) {
158
+ if (!this.connection?.repoUrl) {
128
159
  this.logger.info(
129
160
  "No Git repository configured. Skipping dev workflows loading."
130
161
  );