@red-hat-developer-hub/backstage-plugin-orchestrator-backend 8.9.5 → 8.10.1

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,32 @@
1
1
  # @red-hat-developer-hub/backstage-plugin-orchestrator-backend
2
2
 
3
+ ## 8.10.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 43e0722: add the average duration for a workflow run in the stats
8
+ - 22f75ad: Fix workflow run stats on entity catalog workflow overview by querying instances with workflow definition ids and optional target entity filter.
9
+ - 7c2f5d2: Updated dependency `prettier` to `3.8.4`.
10
+ - Updated dependencies [43e0722]
11
+ - @red-hat-developer-hub/backstage-plugin-orchestrator-common@3.7.1
12
+ - @red-hat-developer-hub/backstage-plugin-orchestrator-node@1.3.1
13
+
14
+ ## 8.10.0
15
+
16
+ ### Minor Changes
17
+
18
+ - bd80b86: Backstage version bump to v1.51.1
19
+
20
+ ### Patch Changes
21
+
22
+ - d908e3e: Fix an issue where filtering workflow runs by status or date could show an error instead of results.
23
+ - bbcdc56: update the workflow overview api to include the success ratio for a worfklow. Also add the total runs(for the last 30 days) for each workflow
24
+ - a6cd70c: Add the ability to send nested filters with the same field
25
+ - Updated dependencies [bbcdc56]
26
+ - Updated dependencies [bd80b86]
27
+ - @red-hat-developer-hub/backstage-plugin-orchestrator-common@3.7.0
28
+ - @red-hat-developer-hub/backstage-plugin-orchestrator-node@1.3.0
29
+
3
30
  ## 8.9.5
4
31
 
5
32
  ### Patch Changes
@@ -54,16 +54,27 @@ function handleLogicalFilter(introspection, type, filter) {
54
54
  return filterClause;
55
55
  }
56
56
  function handleNestedFilter(introspection, type, filter) {
57
- const subClauses = buildFilterCondition(
58
- introspection,
59
- type,
60
- filter.nested,
61
- true
62
- );
63
- const filterClause = {
64
- clauseVariable: subClauses.clauseVariable,
65
- clause: `${filter.field}: {${subClauses.clause}}`
66
- };
57
+ let filterClause;
58
+ if (Array.isArray(filter.nested)) {
59
+ const subClauses = filter.nested.map(
60
+ (n) => buildFilterCondition(introspection, type, n, true)
61
+ );
62
+ filterClause = {
63
+ clauseVariable: subClauses.flatMap((cl) => cl.clauseVariable),
64
+ clause: `${filter.field}: {${subClauses.map((cl) => cl.clause).join(", ")}}`
65
+ };
66
+ } else {
67
+ const subClauses = buildFilterCondition(
68
+ introspection,
69
+ type,
70
+ filter.nested,
71
+ true
72
+ );
73
+ filterClause = {
74
+ clauseVariable: subClauses.clauseVariable,
75
+ clause: `${filter.field}: {${subClauses.clause}}`
76
+ };
77
+ }
67
78
  return filterClause;
68
79
  }
69
80
  function getGraphQLVariableType(fieldName, fieldDef, type, isArray) {
@@ -295,7 +306,33 @@ function getGraphQLOperator(operator) {
295
306
  function nonSecureRandomAlphaNumeric() {
296
307
  return node_crypto.randomBytes(8).toString("hex");
297
308
  }
309
+ function groupNestedFilters(node) {
310
+ if (!isLogicalFilter(node)) return node;
311
+ const processed = node.filters.map(groupNestedFilters);
312
+ const grouped = /* @__PURE__ */ new Map();
313
+ const entries = [];
314
+ for (const filter of processed) {
315
+ if (!("field" in filter)) {
316
+ entries.push({ kind: "single", filter });
317
+ continue;
318
+ }
319
+ if (!grouped.has(filter.field)) {
320
+ grouped.set(filter.field, []);
321
+ entries.push({ kind: "group", field: filter.field });
322
+ }
323
+ grouped.get(filter.field).push(filter);
324
+ }
325
+ const newFilters = entries.map((entry) => {
326
+ if (entry.kind === "single") return entry.filter;
327
+ const filters = grouped.get(entry.field);
328
+ if (filters.length === 1) return filters[0];
329
+ const nested = filters.filter((f) => "nested" in f).map((f) => f.nested);
330
+ return { field: entry.field, nested };
331
+ });
332
+ return { ...node, filters: newFilters };
333
+ }
298
334
 
299
335
  exports.buildFilterCondition = buildFilterCondition;
336
+ exports.groupNestedFilters = groupNestedFilters;
300
337
  exports.isOperatorAllowedForField = isOperatorAllowedForField;
301
338
  //# sourceMappingURL=filterBuilder.cjs.js.map
@@ -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\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 getGraphQLVariableType(\n fieldName: string,\n fieldDef: IntrospectionField | undefined,\n type: ProcessType,\n isArray: boolean,\n): string {\n if (isEnumFilter(fieldName, type)) {\n return isArray ? '[ProcessInstanceState!]' : 'ProcessInstanceState';\n }\n\n if (fieldDef?.type.name === TypeName.Date) {\n return 'DateTime!';\n }\n\n if (isArray) {\n return '[String!]';\n }\n\n return 'String';\n}\n\nfunction handleBetweenOperator(\n filter: FieldFilter,\n fieldDef: IntrospectionField | undefined,\n): 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 paramType = getGraphQLVariableType(\n filter.field,\n fieldDef,\n 'ProcessInstance',\n false,\n );\n const filterClauseVariableArray: FilterClauseVariable[] = [];\n const clauseVariableName1 = `clauseVariable${nonSecureRandomAlphaNumeric()}`;\n const filterClauseVariable1: FilterClauseVariable = {\n clauseVariableName: clauseVariableName1,\n formattedValue: filter.value[0],\n clauseVariableType: paramType,\n };\n\n const clauseVariableName2 = `clauseVariable${nonSecureRandomAlphaNumeric()}`;\n const filterClauseVariable2: FilterClauseVariable = {\n clauseVariableName: clauseVariableName2,\n formattedValue: filter.value[1],\n clauseVariableType: paramType,\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 const isArray = Array.isArray(binaryFilter.value);\n if (isArray) {\n formattedValue = (binaryFilter.value as unknown[]).map((v: unknown) =>\n formatValue(binaryFilter.field, v, fieldDef, type),\n );\n } else {\n formattedValue = formatValue(\n binaryFilter.field,\n binaryFilter.value,\n fieldDef,\n type,\n );\n }\n const paramType = getGraphQLVariableType(\n binaryFilter.field,\n fieldDef,\n type,\n isArray,\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, fieldDef);\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
+ {"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 // check if the nested param is an array or an object\n // this makes sure that we can handle the case where there are multiple filters for the same field\n let filterClause: FilterClause;\n if (Array.isArray(filter.nested)) {\n const subClauses = filter.nested.map(n =>\n buildFilterCondition(introspection, type, n, true),\n );\n filterClause = {\n clauseVariable: subClauses.flatMap(cl => cl.clauseVariable),\n clause: `${filter.field}: {${subClauses.map(cl => cl.clause).join(', ')}}`,\n };\n } else {\n const subClauses = buildFilterCondition(\n introspection,\n type,\n filter.nested,\n true,\n );\n filterClause = {\n clauseVariable: subClauses.clauseVariable,\n clause: `${filter.field}: {${subClauses.clause}}`,\n };\n }\n\n return filterClause;\n}\n\nfunction getGraphQLVariableType(\n fieldName: string,\n fieldDef: IntrospectionField | undefined,\n type: ProcessType,\n isArray: boolean,\n): string {\n if (isEnumFilter(fieldName, type)) {\n return isArray ? '[ProcessInstanceState!]' : 'ProcessInstanceState';\n }\n\n if (fieldDef?.type.name === TypeName.Date) {\n return 'DateTime!';\n }\n\n if (isArray) {\n return '[String!]';\n }\n\n return 'String';\n}\n\nfunction handleBetweenOperator(\n filter: FieldFilter,\n fieldDef: IntrospectionField | undefined,\n): 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 paramType = getGraphQLVariableType(\n filter.field,\n fieldDef,\n 'ProcessInstance',\n false,\n );\n const filterClauseVariableArray: FilterClauseVariable[] = [];\n const clauseVariableName1 = `clauseVariable${nonSecureRandomAlphaNumeric()}`;\n const filterClauseVariable1: FilterClauseVariable = {\n clauseVariableName: clauseVariableName1,\n formattedValue: filter.value[0],\n clauseVariableType: paramType,\n };\n\n const clauseVariableName2 = `clauseVariable${nonSecureRandomAlphaNumeric()}`;\n const filterClauseVariable2: FilterClauseVariable = {\n clauseVariableName: clauseVariableName2,\n formattedValue: filter.value[1],\n clauseVariableType: paramType,\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 const isArray = Array.isArray(binaryFilter.value);\n if (isArray) {\n formattedValue = (binaryFilter.value as unknown[]).map((v: unknown) =>\n formatValue(binaryFilter.field, v, fieldDef, type),\n );\n } else {\n formattedValue = formatValue(\n binaryFilter.field,\n binaryFilter.value,\n fieldDef,\n type,\n );\n }\n const paramType = getGraphQLVariableType(\n binaryFilter.field,\n fieldDef,\n type,\n isArray,\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, fieldDef);\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\n// For nested filters, there might be more than one filter for the same field\n// so we need to group them by the field and then combine the nested filters into an array\nexport function groupNestedFilters(node: Filter): Filter {\n if (!isLogicalFilter(node)) return node;\n\n const processed = node.filters.map(groupNestedFilters);\n const grouped = new Map<string, Filter[]>();\n const entries: Array<\n { kind: 'single'; filter: Filter } | { kind: 'group'; field: string }\n > = [];\n\n for (const filter of processed) {\n if (!('field' in filter)) {\n entries.push({ kind: 'single', filter });\n continue;\n }\n\n if (!grouped.has(filter.field)) {\n grouped.set(filter.field, []);\n entries.push({ kind: 'group', field: filter.field });\n }\n grouped.get(filter.field)!.push(filter);\n }\n\n const newFilters = entries.map(entry => {\n if (entry.kind === 'single') return entry.filter;\n\n const filters = grouped.get(entry.field)!;\n if (filters.length === 1) return filters[0];\n\n const nested = filters\n .filter((f): f is NestedFilter => 'nested' in f)\n .map(f => f.nested);\n\n return { field: entry.field, nested } as unknown as NestedFilter;\n });\n\n return { ...node, filters: newFilters };\n}\n"],"names":["FieldFilterOperatorEnum","TypeName","randomBytes"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  var backendPluginApi = require('@backstage/backend-plugin-api');
4
- var alpha = require('@backstage/plugin-catalog-node/alpha');
5
4
  var backstagePluginOrchestratorNode = require('@red-hat-developer-hub/backstage-plugin-orchestrator-node');
6
5
  var WorkflowLogsProvidersRegistry = require('./providers/WorkflowLogsProvidersRegistry.cjs.js');
7
6
  var index = require('./routerWrapper/index.cjs.js');
@@ -23,7 +22,6 @@ const orchestratorPlugin = backendPluginApi.createBackendPlugin({
23
22
  auditor: backendPluginApi.coreServices.auditor,
24
23
  config: backendPluginApi.coreServices.rootConfig,
25
24
  discovery: backendPluginApi.coreServices.discovery,
26
- catalogApi: alpha.catalogServiceRef,
27
25
  urlReader: backendPluginApi.coreServices.urlReader,
28
26
  permissions: backendPluginApi.coreServices.permissions,
29
27
  scheduler: backendPluginApi.coreServices.scheduler,
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.cjs.js","sources":["../src/plugin.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 coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { catalogServiceRef } from '@backstage/plugin-catalog-node/alpha';\n\nimport {\n WorkflowLogProvider,\n workflowLogsExtensionEndpoint,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-node';\n\nimport { WorkflowLogsProvidersRegistry } from './providers/WorkflowLogsProvidersRegistry';\nimport { createRouter } from './routerWrapper';\n\n/**\n * @public\n * Orchestrator Backend Plugin\n */\nexport const orchestratorPlugin = createBackendPlugin({\n pluginId: 'orchestrator',\n register(env) {\n const workflowLogsProvidersRegistry = new WorkflowLogsProvidersRegistry();\n\n env.registerExtensionPoint(workflowLogsExtensionEndpoint, {\n addWorkflowLogProvider(\n ...newWorkflowLogProviders: WorkflowLogProvider[]\n ) {\n newWorkflowLogProviders.forEach(workflowLogProvider => {\n workflowLogsProvidersRegistry.register(workflowLogProvider);\n });\n },\n });\n env.registerInit({\n deps: {\n logger: coreServices.logger,\n auditor: coreServices.auditor,\n config: coreServices.rootConfig,\n discovery: coreServices.discovery,\n catalogApi: catalogServiceRef,\n urlReader: coreServices.urlReader,\n permissions: coreServices.permissions,\n scheduler: coreServices.scheduler,\n httpAuth: coreServices.httpAuth,\n http: coreServices.httpRouter,\n userInfo: coreServices.userInfo,\n },\n async init(props) {\n const { http } = props;\n const router = await createRouter({\n ...props,\n workflowLogsProvidersRegistry,\n });\n http.use(router);\n http.addAuthPolicy({\n path: '/health',\n allow: 'unauthenticated',\n });\n http.addAuthPolicy({\n path: '/static',\n allow: 'unauthenticated',\n });\n http.addAuthPolicy({\n path: '/docs',\n allow: 'unauthenticated',\n });\n },\n });\n },\n});\n"],"names":["createBackendPlugin","WorkflowLogsProvidersRegistry","workflowLogsExtensionEndpoint","coreServices","catalogServiceRef","createRouter"],"mappings":";;;;;;;;AAkCO,MAAM,qBAAqBA,oCAAA,CAAoB;AAAA,EACpD,QAAA,EAAU,cAAA;AAAA,EACV,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,6BAAA,GAAgC,IAAIC,2DAAA,EAA8B;AAExE,IAAA,GAAA,CAAI,uBAAuBC,6DAAA,EAA+B;AAAA,MACxD,0BACK,uBAAA,EACH;AACA,QAAA,uBAAA,CAAwB,QAAQ,CAAA,mBAAA,KAAuB;AACrD,UAAA,6BAAA,CAA8B,SAAS,mBAAmB,CAAA;AAAA,QAC5D,CAAC,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AACD,IAAA,GAAA,CAAI,YAAA,CAAa;AAAA,MACf,IAAA,EAAM;AAAA,QACJ,QAAQC,6BAAA,CAAa,MAAA;AAAA,QACrB,SAASA,6BAAA,CAAa,OAAA;AAAA,QACtB,QAAQA,6BAAA,CAAa,UAAA;AAAA,QACrB,WAAWA,6BAAA,CAAa,SAAA;AAAA,QACxB,UAAA,EAAYC,uBAAA;AAAA,QACZ,WAAWD,6BAAA,CAAa,SAAA;AAAA,QACxB,aAAaA,6BAAA,CAAa,WAAA;AAAA,QAC1B,WAAWA,6BAAA,CAAa,SAAA;AAAA,QACxB,UAAUA,6BAAA,CAAa,QAAA;AAAA,QACvB,MAAMA,6BAAA,CAAa,UAAA;AAAA,QACnB,UAAUA,6BAAA,CAAa;AAAA,OACzB;AAAA,MACA,MAAM,KAAK,KAAA,EAAO;AAChB,QAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AACjB,QAAA,MAAM,MAAA,GAAS,MAAME,kBAAA,CAAa;AAAA,UAChC,GAAG,KAAA;AAAA,UACH;AAAA,SACD,CAAA;AACD,QAAA,IAAA,CAAK,IAAI,MAAM,CAAA;AACf,QAAA,IAAA,CAAK,aAAA,CAAc;AAAA,UACjB,IAAA,EAAM,SAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACR,CAAA;AACD,QAAA,IAAA,CAAK,aAAA,CAAc;AAAA,UACjB,IAAA,EAAM,SAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACR,CAAA;AACD,QAAA,IAAA,CAAK,aAAA,CAAc;AAAA,UACjB,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAC;;;;"}
1
+ {"version":3,"file":"plugin.cjs.js","sources":["../src/plugin.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 coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\n\nimport {\n WorkflowLogProvider,\n workflowLogsExtensionEndpoint,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-node';\n\nimport { WorkflowLogsProvidersRegistry } from './providers/WorkflowLogsProvidersRegistry';\nimport { createRouter } from './routerWrapper';\n\n/**\n * @public\n * Orchestrator Backend Plugin\n */\nexport const orchestratorPlugin = createBackendPlugin({\n pluginId: 'orchestrator',\n register(env) {\n const workflowLogsProvidersRegistry = new WorkflowLogsProvidersRegistry();\n\n env.registerExtensionPoint(workflowLogsExtensionEndpoint, {\n addWorkflowLogProvider(\n ...newWorkflowLogProviders: WorkflowLogProvider[]\n ) {\n newWorkflowLogProviders.forEach(workflowLogProvider => {\n workflowLogsProvidersRegistry.register(workflowLogProvider);\n });\n },\n });\n env.registerInit({\n deps: {\n logger: coreServices.logger,\n auditor: coreServices.auditor,\n config: coreServices.rootConfig,\n discovery: coreServices.discovery,\n urlReader: coreServices.urlReader,\n permissions: coreServices.permissions,\n scheduler: coreServices.scheduler,\n httpAuth: coreServices.httpAuth,\n http: coreServices.httpRouter,\n userInfo: coreServices.userInfo,\n },\n async init(props) {\n const { http } = props;\n const router = await createRouter({\n ...props,\n workflowLogsProvidersRegistry,\n });\n http.use(router);\n http.addAuthPolicy({\n path: '/health',\n allow: 'unauthenticated',\n });\n http.addAuthPolicy({\n path: '/static',\n allow: 'unauthenticated',\n });\n http.addAuthPolicy({\n path: '/docs',\n allow: 'unauthenticated',\n });\n },\n });\n },\n});\n"],"names":["createBackendPlugin","WorkflowLogsProvidersRegistry","workflowLogsExtensionEndpoint","coreServices","createRouter"],"mappings":";;;;;;;AAiCO,MAAM,qBAAqBA,oCAAA,CAAoB;AAAA,EACpD,QAAA,EAAU,cAAA;AAAA,EACV,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,6BAAA,GAAgC,IAAIC,2DAAA,EAA8B;AAExE,IAAA,GAAA,CAAI,uBAAuBC,6DAAA,EAA+B;AAAA,MACxD,0BACK,uBAAA,EACH;AACA,QAAA,uBAAA,CAAwB,QAAQ,CAAA,mBAAA,KAAuB;AACrD,UAAA,6BAAA,CAA8B,SAAS,mBAAmB,CAAA;AAAA,QAC5D,CAAC,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AACD,IAAA,GAAA,CAAI,YAAA,CAAa;AAAA,MACf,IAAA,EAAM;AAAA,QACJ,QAAQC,6BAAA,CAAa,MAAA;AAAA,QACrB,SAASA,6BAAA,CAAa,OAAA;AAAA,QACtB,QAAQA,6BAAA,CAAa,UAAA;AAAA,QACrB,WAAWA,6BAAA,CAAa,SAAA;AAAA,QACxB,WAAWA,6BAAA,CAAa,SAAA;AAAA,QACxB,aAAaA,6BAAA,CAAa,WAAA;AAAA,QAC1B,WAAWA,6BAAA,CAAa,SAAA;AAAA,QACxB,UAAUA,6BAAA,CAAa,QAAA;AAAA,QACvB,MAAMA,6BAAA,CAAa,UAAA;AAAA,QACnB,UAAUA,6BAAA,CAAa;AAAA,OACzB;AAAA,MACA,MAAM,KAAK,KAAA,EAAO;AAChB,QAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AACjB,QAAA,MAAM,MAAA,GAAS,MAAMC,kBAAA,CAAa;AAAA,UAChC,GAAG,KAAA;AAAA,UACH;AAAA,SACD,CAAA;AACD,QAAA,IAAA,CAAK,IAAI,MAAM,CAAA;AACf,QAAA,IAAA,CAAK,aAAA,CAAc;AAAA,UACjB,IAAA,EAAM,SAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACR,CAAA;AACD,QAAA,IAAA,CAAK,aAAA,CAAc;AAAA,UACjB,IAAA,EAAM,SAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACR,CAAA;AACD,QAAA,IAAA,CAAK,aAAA,CAAc;AAAA,UACjB,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../src/routerWrapper/index.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 type {\n AuditorService,\n DiscoveryService,\n HttpAuthService,\n LoggerService,\n PermissionsService,\n SchedulerService,\n UrlReaderService,\n UserInfoService,\n} from '@backstage/backend-plugin-api';\nimport type { CatalogApi } from '@backstage/catalog-client';\nimport type { Config } from '@backstage/config';\n\nimport express from 'express';\n\nimport { WorkflowLogsProvidersRegistry } from '../providers/WorkflowLogsProvidersRegistry';\nimport { DevModeService } from '../service/DevModeService';\nimport { createBackendRouter } from '../service/router';\n\nexport interface RouterOptions {\n config: Config;\n logger: LoggerService;\n auditor: AuditorService;\n discovery: DiscoveryService;\n catalogApi: CatalogApi;\n urlReader: UrlReaderService;\n scheduler: SchedulerService;\n permissions: PermissionsService;\n httpAuth: HttpAuthService;\n userInfo: UserInfoService;\n workflowLogsProvidersRegistry: WorkflowLogsProvidersRegistry;\n}\n\nexport async function createRouter(\n args: RouterOptions,\n): Promise<express.Router> {\n const autoStartDevMode =\n args.config.getOptionalBoolean(\n 'orchestrator.sonataFlowService.autoStart',\n ) ?? false;\n\n if (autoStartDevMode) {\n const devModeService = new DevModeService(args.config, args.logger);\n\n const isSonataFlowUp = await devModeService.launchDevMode();\n\n if (!isSonataFlowUp) {\n args.logger.error('SonataFlow is not up. Check your configuration.');\n }\n }\n\n return await createBackendRouter({\n config: args.config,\n logger: args.logger,\n auditor: args.auditor,\n discovery: args.discovery,\n catalogApi: args.catalogApi,\n urlReader: args.urlReader,\n scheduler: args.scheduler,\n permissions: args.permissions,\n httpAuth: args.httpAuth,\n userInfo: args.userInfo,\n workflowLogsProvidersRegistry: args.workflowLogsProvidersRegistry,\n });\n}\n"],"names":["DevModeService","createBackendRouter"],"mappings":";;;;;AAiDA,eAAsB,aACpB,IAAA,EACyB;AACzB,EAAA,MAAM,gBAAA,GACJ,KAAK,MAAA,CAAO,kBAAA;AAAA,IACV;AAAA,GACF,IAAK,KAAA;AAEP,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,MAAM,iBAAiB,IAAIA,6BAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,KAAK,MAAM,CAAA;AAElE,IAAA,MAAM,cAAA,GAAiB,MAAM,cAAA,CAAe,aAAA,EAAc;AAE1D,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,iDAAiD,CAAA;AAAA,IACrE;AAAA,EACF;AAEA,EAAA,OAAO,MAAMC,0BAAA,CAAoB;AAAA,IAC/B,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,SAAS,IAAA,CAAK,OAAA;AAAA,IAId,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,+BAA+B,IAAA,CAAK;AAAA,GACrC,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../src/routerWrapper/index.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 type {\n AuditorService,\n DiscoveryService,\n HttpAuthService,\n LoggerService,\n PermissionsService,\n SchedulerService,\n UrlReaderService,\n UserInfoService,\n} from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\n\nimport express from 'express';\n\nimport { WorkflowLogsProvidersRegistry } from '../providers/WorkflowLogsProvidersRegistry';\nimport { DevModeService } from '../service/DevModeService';\nimport { createBackendRouter } from '../service/router';\n\nexport interface RouterOptions {\n config: Config;\n logger: LoggerService;\n auditor: AuditorService;\n discovery: DiscoveryService;\n urlReader: UrlReaderService;\n scheduler: SchedulerService;\n permissions: PermissionsService;\n httpAuth: HttpAuthService;\n userInfo: UserInfoService;\n workflowLogsProvidersRegistry: WorkflowLogsProvidersRegistry;\n}\n\nexport async function createRouter(\n args: RouterOptions,\n): Promise<express.Router> {\n const autoStartDevMode =\n args.config.getOptionalBoolean(\n 'orchestrator.sonataFlowService.autoStart',\n ) ?? false;\n\n if (autoStartDevMode) {\n const devModeService = new DevModeService(args.config, args.logger);\n\n const isSonataFlowUp = await devModeService.launchDevMode();\n\n if (!isSonataFlowUp) {\n args.logger.error('SonataFlow is not up. Check your configuration.');\n }\n }\n\n return await createBackendRouter({\n config: args.config,\n logger: args.logger,\n auditor: args.auditor,\n discovery: args.discovery,\n urlReader: args.urlReader,\n scheduler: args.scheduler,\n permissions: args.permissions,\n httpAuth: args.httpAuth,\n userInfo: args.userInfo,\n workflowLogsProvidersRegistry: args.workflowLogsProvidersRegistry,\n });\n}\n"],"names":["DevModeService","createBackendRouter"],"mappings":";;;;;AA+CA,eAAsB,aACpB,IAAA,EACyB;AACzB,EAAA,MAAM,gBAAA,GACJ,KAAK,MAAA,CAAO,kBAAA;AAAA,IACV;AAAA,GACF,IAAK,KAAA;AAEP,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,MAAM,iBAAiB,IAAIA,6BAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,KAAK,MAAM,CAAA;AAElE,IAAA,MAAM,cAAA,GAAiB,MAAM,cAAA,CAAe,aAAA,EAAc;AAE1D,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,iDAAiD,CAAA;AAAA,IACrE;AAAA,EACF;AAEA,EAAA,OAAO,MAAMC,0BAAA,CAAoB;AAAA,IAC/B,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,SAAS,IAAA,CAAK,OAAA;AAAA,IAGd,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,+BAA+B,IAAA,CAAK;AAAA,GACrC,CAAA;AACH;;;;"}
@@ -190,10 +190,11 @@ class DataIndexService {
190
190
  const processIdNotNullCondition = "processId: {isNull: false}";
191
191
  const definitionIdsCondition = definitionIds && definitionIds.length > 0 ? `processId: {in: ${JSON.stringify(definitionIds)}}` : void 0;
192
192
  const type = "ProcessInstance";
193
- const filterCondition = filter ? filterBuilder.buildFilterCondition(
193
+ const processedFilters = filter ? filterBuilder.groupNestedFilters(filter) : void 0;
194
+ const filterCondition = processedFilters ? filterBuilder.buildFilterCondition(
194
195
  await this.inspectInputArgument(type),
195
196
  type,
196
- filter
197
+ processedFilters
197
198
  ) : void 0;
198
199
  let whereClause = "";
199
200
  const conditions = [];
@@ -1 +1 @@
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 IntrospectionField,\n NestedFilter,\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 {\n buildGraphQlQuery,\n buildQueryParamVariable,\n} 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 = gql`\n query FindProcessInstanceQuery($definitionId: String!) {\n ProcessDefinitions(where: { id: { equal: $definitionId } }) {\n id\n name\n version\n type\n endpoint\n serviceUrl\n source\n }\n }\n `;\n\n const result = await this.client.query(graphQlQuery, {\n definitionId,\n });\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 private filterDeletedWorkflows(workflows: WorkflowInfo[]): WorkflowInfo[] {\n // filter deleted workflows, that were deleted via deleting SonataFlow CR, operator marks them as unavailable\n // Note this is different then the isAvailable status in WorkflowOverviewDTO, that is used to mark workflows that are not available on the service for unexpected reasons\n\n const availableWorkflows: WorkflowInfo[] = [];\n const unavailableWorkflows: WorkflowInfo[] = [];\n\n workflows.forEach(workflow => {\n const isUnavailable = workflow.metadata?.status === 'unavailable';\n if (isUnavailable) {\n unavailableWorkflows.push(workflow);\n } else {\n availableWorkflows.push(workflow);\n }\n });\n\n this.logger.debug(\n `filtered deleted workflows when fetching workflow infos: ${JSON.stringify(\n unavailableWorkflows.map(w => ({\n id: w.id,\n name: w.name,\n status: w.metadata?.status,\n })),\n )}`,\n );\n\n return availableWorkflows;\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 (definitionIdsCondition && filterCondition) {\n whereClause = `and: [{${definitionIdsCondition}}, {${filterCondition?.clause}}]`;\n } else if (definitionIdsCondition || filterCondition) {\n whereClause = definitionIdsCondition ?? filterCondition?.clause;\n } else {\n whereClause = undefined;\n }\n\n const graphQlQuery = buildGraphQlQuery({\n type: 'ProcessDefinitions',\n queryBody:\n 'id, name, version, type, endpoint, serviceUrl, source, metadata',\n whereClause,\n pagination,\n filterCondition: filterCondition,\n });\n this.logger.debug(`GraphQL query: ${graphQlQuery}`);\n\n const paramVariables = buildQueryParamVariable(pagination, filterCondition);\n\n this.logger.debug(`GraphQL query params:`, paramVariables);\n\n const result = await this.client.query(graphQlQuery, paramVariables);\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 this.filterDeletedWorkflows(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 =\n definitionIds && definitionIds.length > 0\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 : undefined;\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 (filterCondition) {\n conditions.push(`{${filterCondition?.clause}}`);\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, version, processName, processId, state, start, end, nodes { id }, variables, executionSummary, parentProcessInstance {id, processName, businessKey}',\n whereClause,\n pagination,\n filterCondition: filterCondition,\n });\n\n this.logger.debug(`GraphQL query: ${graphQlQuery}`);\n\n const paramVariables = buildQueryParamVariable(pagination, filterCondition);\n\n this.logger.debug(`GraphQL query params:`, paramVariables);\n\n const result = await this.client.query<{\n ProcessInstances: ProcessInstance[];\n }>(graphQlQuery, paramVariables);\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 public async fetchDefinitionIdsFromInstances(args: {\n targetEntity: string;\n }): Promise<string[]> {\n const { targetEntity } = args;\n\n const processIdNotNullCondition = 'processId: {isNull: false}';\n\n const type = 'ProcessInstance';\n const targetEntityFilter: NestedFilter = {\n field: 'variables',\n nested: {\n operator: 'EQ',\n field: 'targetEntity',\n value: targetEntity,\n },\n };\n\n const filterCondition = buildFilterCondition(\n await this.inspectInputArgument(type),\n type,\n targetEntityFilter,\n );\n\n const whereClause = `and: [{${processIdNotNullCondition}}, {${filterCondition.clause}}]`;\n\n // Apply a limit to prevent memory exhaustion and network timeouts when entities\n // have thousands of process instances. Entities with more instances than this limit\n // may not see all their associated workflows.\n const pagination = {\n limit: 1000,\n offset: 0,\n };\n\n const graphQlQuery = buildGraphQlQuery({\n type: 'ProcessInstances',\n queryBody: 'processId',\n whereClause,\n pagination,\n filterCondition,\n });\n\n this.logger.debug(`GraphQL query: ${graphQlQuery}`);\n\n const paramVariables = buildQueryParamVariable(pagination, filterCondition);\n\n this.logger.debug(`GraphQL query params:`, paramVariables);\n\n const result = await this.client.query<{\n ProcessInstances: ProcessInstance[];\n }>(graphQlQuery, paramVariables);\n this.logger.debug(\n `Fetch definition ids from instances history result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching definition ids from instances history',\n result,\n );\n\n const processInstancesSrc = result.data ? result.data.ProcessInstances : [];\n const distinctProcessIds = [\n ...new Set(processInstancesSrc.map(instance => instance.processId)),\n ]; // graphql doesn't support distinct so we need to use a set to get the distinct process ids\n return distinctProcessIds;\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 if (workflowInfo) {\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 = gql`\n query FindProcessInstanceQuery($definitionId: String!) {\n ProcessDefinitions(where: { id: { equal: $definitionId } }) {\n id\n source\n }\n }\n `;\n\n const result = await this.client.query(graphQlQuery, {\n definitionId,\n });\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 targetEntity?: string;\n }): Promise<ProcessInstance[]> {\n const targetEntityWhereCondition = args.targetEntity\n ? `, variables: {targetEntity: {equal: $targetEntity } }`\n : '';\n\n const graphQlQuery = gql`\n query FindProcessInstanceQuery($definitionId: String!, $limit: Int!, $offset: Int! ${args.targetEntity ? `, $targetEntity: String` : ''}) {\n ProcessInstances(\n where: {processId: {equal: $definitionId } ${targetEntityWhereCondition} },\n orderBy: {start:DESC},\n pagination: {limit: $limit, offset: $offset}\n ) { id, version, processName, state, start, end }\n }\n `;\n\n const result = await this.client.query(\n graphQlQuery,\n args.targetEntity\n ? {\n definitionId: args.definitionId,\n limit: args.limit,\n offset: args.offset,\n targetEntity: args.targetEntity,\n }\n : {\n definitionId: args.definitionId,\n limit: args.limit,\n offset: args.offset,\n },\n );\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 = gql`\n query FindProcessInstanceQuery($instanceId: String!) {\n ProcessInstances(where: { id: { equal: $instanceId } }) {\n variables\n }\n }\n `;\n\n const result = await this.client.query(graphQlQuery, {\n instanceId,\n });\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 = gql`\n query FindProcessInstanceQuery($instanceId: String!) {\n ProcessInstances(where: { id: { equal: $instanceId } }) {\n processId\n }\n }\n `;\n\n const result = await this.client.query(graphQlQuery, {\n instanceId,\n });\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 version\n processName\n processId\n serviceUrl\n executionSummary\n state\n start\n end\n nodes {\n id\n nodeId\n definitionId\n type\n name\n enter\n exit\n errorMessage\n }\n variables\n parentProcessInstance {\n id\n processName\n businessKey\n }\n error {\n nodeDefinitionId\n nodeInstanceId\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 = this.removeNodes(processInstances[0]);\n\n const workflowInfo = await this.fetchWorkflowInfo(instance.processId);\n if (!workflowInfo?.source) {\n throw new Error(\n `Workflow definition is required to fetch instance ${instance.id}`,\n );\n }\n const workflowDefinitionSrc: WorkflowDefinition = fromWorkflowSource(\n workflowInfo.source,\n );\n if (workflowInfo) {\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\n this.logger.error(scenario, result);\n\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 }\n\n const graphQLErrors = result.error.graphQLErrors;\n if (\n result.data &&\n Array.isArray(graphQLErrors) &&\n graphQLErrors.length > 0\n ) {\n const graphQLError = graphQLErrors[0];\n if (\n graphQLError?.extensions?.classification === 'DataFetchingException'\n ) {\n // we have data (perhaps partial) and it is a data fetch error ==> log and ignore\n return;\n }\n }\n\n throw result.error;\n }\n\n private removeNodes(instance: ProcessInstance): ProcessInstance {\n const errorNodeId = instance.error?.nodeInstanceId;\n instance.nodes = instance.nodes.filter(node => {\n return !node.errorMessage || node.id === errorNodeId;\n });\n return instance;\n }\n}\n"],"names":["ErrorBuilder","Client","fetchExchange","gql","buildFilterCondition","buildGraphQlQuery","buildQueryParamVariable","FETCH_PROCESS_INSTANCES_SORT_FIELD","parseWorkflowVariables","fromWorkflowSource"],"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 IntrospectionField,\n NestedFilter,\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 {\n buildFilterCondition,\n groupNestedFilters,\n} from '../helpers/filterBuilder';\nimport {\n buildGraphQlQuery,\n buildQueryParamVariable,\n} 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 = gql`\n query FindProcessInstanceQuery($definitionId: String!) {\n ProcessDefinitions(where: { id: { equal: $definitionId } }) {\n id\n name\n version\n type\n endpoint\n serviceUrl\n source\n }\n }\n `;\n\n const result = await this.client.query(graphQlQuery, {\n definitionId,\n });\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 private filterDeletedWorkflows(workflows: WorkflowInfo[]): WorkflowInfo[] {\n // filter deleted workflows, that were deleted via deleting SonataFlow CR, operator marks them as unavailable\n // Note this is different then the isAvailable status in WorkflowOverviewDTO, that is used to mark workflows that are not available on the service for unexpected reasons\n\n const availableWorkflows: WorkflowInfo[] = [];\n const unavailableWorkflows: WorkflowInfo[] = [];\n\n workflows.forEach(workflow => {\n const isUnavailable = workflow.metadata?.status === 'unavailable';\n if (isUnavailable) {\n unavailableWorkflows.push(workflow);\n } else {\n availableWorkflows.push(workflow);\n }\n });\n\n this.logger.debug(\n `filtered deleted workflows when fetching workflow infos: ${JSON.stringify(\n unavailableWorkflows.map(w => ({\n id: w.id,\n name: w.name,\n status: w.metadata?.status,\n })),\n )}`,\n );\n\n return availableWorkflows;\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 (definitionIdsCondition && filterCondition) {\n whereClause = `and: [{${definitionIdsCondition}}, {${filterCondition?.clause}}]`;\n } else if (definitionIdsCondition || filterCondition) {\n whereClause = definitionIdsCondition ?? filterCondition?.clause;\n } else {\n whereClause = undefined;\n }\n\n const graphQlQuery = buildGraphQlQuery({\n type: 'ProcessDefinitions',\n queryBody:\n 'id, name, version, type, endpoint, serviceUrl, source, metadata',\n whereClause,\n pagination,\n filterCondition: filterCondition,\n });\n this.logger.debug(`GraphQL query: ${graphQlQuery}`);\n\n const paramVariables = buildQueryParamVariable(pagination, filterCondition);\n\n this.logger.debug(`GraphQL query params:`, paramVariables);\n\n const result = await this.client.query(graphQlQuery, paramVariables);\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 this.filterDeletedWorkflows(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 =\n definitionIds && definitionIds.length > 0\n ? `processId: {in: ${JSON.stringify(definitionIds)}}`\n : undefined;\n const type = 'ProcessInstance';\n\n // For nested filters, there might be more than one filter for the same field\n // so we need to group them by the field and then combine the nested filters into an array\n const processedFilters = filter ? groupNestedFilters(filter) : undefined;\n\n const filterCondition = processedFilters\n ? buildFilterCondition(\n await this.inspectInputArgument(type),\n type,\n processedFilters,\n )\n : undefined;\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 (filterCondition) {\n conditions.push(`{${filterCondition?.clause}}`);\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, version, processName, processId, state, start, end, nodes { id }, variables, executionSummary, parentProcessInstance {id, processName, businessKey}',\n whereClause,\n pagination,\n filterCondition: filterCondition,\n });\n\n this.logger.debug(`GraphQL query: ${graphQlQuery}`);\n\n const paramVariables = buildQueryParamVariable(pagination, filterCondition);\n\n this.logger.debug(`GraphQL query params:`, paramVariables);\n\n const result = await this.client.query<{\n ProcessInstances: ProcessInstance[];\n }>(graphQlQuery, paramVariables);\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 public async fetchDefinitionIdsFromInstances(args: {\n targetEntity: string;\n }): Promise<string[]> {\n const { targetEntity } = args;\n\n const processIdNotNullCondition = 'processId: {isNull: false}';\n\n const type = 'ProcessInstance';\n const targetEntityFilter: NestedFilter = {\n field: 'variables',\n nested: {\n operator: 'EQ',\n field: 'targetEntity',\n value: targetEntity,\n },\n };\n\n const filterCondition = buildFilterCondition(\n await this.inspectInputArgument(type),\n type,\n targetEntityFilter,\n );\n\n const whereClause = `and: [{${processIdNotNullCondition}}, {${filterCondition.clause}}]`;\n\n // Apply a limit to prevent memory exhaustion and network timeouts when entities\n // have thousands of process instances. Entities with more instances than this limit\n // may not see all their associated workflows.\n const pagination = {\n limit: 1000,\n offset: 0,\n };\n\n const graphQlQuery = buildGraphQlQuery({\n type: 'ProcessInstances',\n queryBody: 'processId',\n whereClause,\n pagination,\n filterCondition,\n });\n\n this.logger.debug(`GraphQL query: ${graphQlQuery}`);\n\n const paramVariables = buildQueryParamVariable(pagination, filterCondition);\n\n this.logger.debug(`GraphQL query params:`, paramVariables);\n\n const result = await this.client.query<{\n ProcessInstances: ProcessInstance[];\n }>(graphQlQuery, paramVariables);\n this.logger.debug(\n `Fetch definition ids from instances history result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching definition ids from instances history',\n result,\n );\n\n const processInstancesSrc = result.data ? result.data.ProcessInstances : [];\n const distinctProcessIds = [\n ...new Set(processInstancesSrc.map(instance => instance.processId)),\n ]; // graphql doesn't support distinct so we need to use a set to get the distinct process ids\n return distinctProcessIds;\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 if (workflowInfo) {\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 = gql`\n query FindProcessInstanceQuery($definitionId: String!) {\n ProcessDefinitions(where: { id: { equal: $definitionId } }) {\n id\n source\n }\n }\n `;\n\n const result = await this.client.query(graphQlQuery, {\n definitionId,\n });\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 targetEntity?: string;\n }): Promise<ProcessInstance[]> {\n const targetEntityWhereCondition = args.targetEntity\n ? `, variables: {targetEntity: {equal: $targetEntity } }`\n : '';\n\n const graphQlQuery = gql`\n query FindProcessInstanceQuery($definitionId: String!, $limit: Int!, $offset: Int! ${args.targetEntity ? `, $targetEntity: String` : ''}) {\n ProcessInstances(\n where: {processId: {equal: $definitionId } ${targetEntityWhereCondition} },\n orderBy: {start:DESC},\n pagination: {limit: $limit, offset: $offset}\n ) { id, version, processName, state, start, end }\n }\n `;\n\n const result = await this.client.query(\n graphQlQuery,\n args.targetEntity\n ? {\n definitionId: args.definitionId,\n limit: args.limit,\n offset: args.offset,\n targetEntity: args.targetEntity,\n }\n : {\n definitionId: args.definitionId,\n limit: args.limit,\n offset: args.offset,\n },\n );\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 = gql`\n query FindProcessInstanceQuery($instanceId: String!) {\n ProcessInstances(where: { id: { equal: $instanceId } }) {\n variables\n }\n }\n `;\n\n const result = await this.client.query(graphQlQuery, {\n instanceId,\n });\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 = gql`\n query FindProcessInstanceQuery($instanceId: String!) {\n ProcessInstances(where: { id: { equal: $instanceId } }) {\n processId\n }\n }\n `;\n\n const result = await this.client.query(graphQlQuery, {\n instanceId,\n });\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 version\n processName\n processId\n serviceUrl\n executionSummary\n state\n start\n end\n nodes {\n id\n nodeId\n definitionId\n type\n name\n enter\n exit\n errorMessage\n }\n variables\n parentProcessInstance {\n id\n processName\n businessKey\n }\n error {\n nodeDefinitionId\n nodeInstanceId\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 = this.removeNodes(processInstances[0]);\n\n const workflowInfo = await this.fetchWorkflowInfo(instance.processId);\n if (!workflowInfo?.source) {\n throw new Error(\n `Workflow definition is required to fetch instance ${instance.id}`,\n );\n }\n const workflowDefinitionSrc: WorkflowDefinition = fromWorkflowSource(\n workflowInfo.source,\n );\n if (workflowInfo) {\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\n this.logger.error(scenario, result);\n\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 }\n\n const graphQLErrors = result.error.graphQLErrors;\n if (\n result.data &&\n Array.isArray(graphQLErrors) &&\n graphQLErrors.length > 0\n ) {\n const graphQLError = graphQLErrors[0];\n if (\n graphQLError?.extensions?.classification === 'DataFetchingException'\n ) {\n // we have data (perhaps partial) and it is a data fetch error ==> log and ignore\n return;\n }\n }\n\n throw result.error;\n }\n\n private removeNodes(instance: ProcessInstance): ProcessInstance {\n const errorNodeId = instance.error?.nodeInstanceId;\n instance.nodes = instance.nodes.filter(node => {\n return !node.errorMessage || node.id === errorNodeId;\n });\n return instance;\n }\n}\n"],"names":["ErrorBuilder","Client","fetchExchange","gql","buildFilterCondition","buildGraphQlQuery","buildQueryParamVariable","FETCH_PROCESS_INSTANCES_SORT_FIELD","groupNestedFilters","parseWorkflowVariables","fromWorkflowSource"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  require('fs-extra');
4
+ var backstagePluginOrchestratorCommon = require('@red-hat-developer-hub/backstage-plugin-orchestrator-common');
4
5
  require('os');
5
6
 
6
7
  async function retryAsyncFunction(args) {
@@ -37,8 +38,42 @@ async function executeWithRetry(action, maxErrors = 15) {
37
38
  function delay(time) {
38
39
  return new Promise((r) => setTimeout(r, time));
39
40
  }
41
+ function groupByProcessIdAndVersion(instances) {
42
+ return instances.reduce((acc, item) => {
43
+ acc[`${item.processId}-${item.version}`] ??= [];
44
+ acc[`${item.processId}-${item.version}`].push(item);
45
+ return acc;
46
+ }, {});
47
+ }
48
+ function getWorkflowRunStats(groupedData) {
49
+ return Object.entries(groupedData).map(([processIdVersion, items]) => {
50
+ const averageTimeToComplete = items.reduce((acc, item) => {
51
+ return acc + (item.end && item.start ? new Date(item.end).getTime() - new Date(item.start).getTime() : 0);
52
+ }, 0) / items.length;
53
+ const successCount = items.filter(
54
+ (item) => item.state === backstagePluginOrchestratorCommon.ProcessInstanceState.Completed
55
+ ).length;
56
+ const errorCount = items.filter(
57
+ (item) => item.state === backstagePluginOrchestratorCommon.ProcessInstanceState.Error
58
+ ).length;
59
+ const runsLastMonth = items.filter(
60
+ (item) => item.start && new Date(item.start) > new Date(Date.now() - 30 * 24 * 60 * 60 * 1e3)
61
+ );
62
+ return {
63
+ processIdVersion,
64
+ successCount,
65
+ errorCount,
66
+ totalCount: successCount + errorCount,
67
+ successRatio: successCount / (successCount + errorCount),
68
+ runsLastMonth: runsLastMonth.length,
69
+ averageTimeToComplete
70
+ };
71
+ });
72
+ }
40
73
 
41
74
  exports.delay = delay;
42
75
  exports.executeWithRetry = executeWithRetry;
76
+ exports.getWorkflowRunStats = getWorkflowRunStats;
77
+ exports.groupByProcessIdAndVersion = groupByProcessIdAndVersion;
43
78
  exports.retryAsyncFunction = retryAsyncFunction;
44
79
  //# sourceMappingURL=Helper.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Helper.cjs.js","sources":["../../src/service/Helper.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 type { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\n\nimport fs from 'fs-extra';\n\nimport os from 'os';\n\nexport async function retryAsyncFunction<T>(args: {\n asyncFn: () => Promise<T | undefined>;\n maxAttempts: number;\n delayMs: number;\n}): Promise<T> {\n let result: T | undefined;\n for (let i = 0; i < args.maxAttempts; i++) {\n result = await args.asyncFn();\n if (result !== undefined) {\n return result;\n }\n await new Promise(resolve => setTimeout(resolve, args.delayMs));\n }\n throw new Error('Exceeded maximum number of retries for async function');\n}\n\nexport async function getWorkingDirectory(\n config: Config,\n logger: LoggerService,\n): Promise<string> {\n if (!config.has('backend.workingDirectory')) {\n return os.tmpdir();\n }\n\n const workingDirectory = config.getString('backend.workingDirectory');\n try {\n // Check if working directory exists and is writable\n await fs.access(workingDirectory, fs.constants.F_OK | fs.constants.W_OK);\n logger.info(`using working directory: ${workingDirectory}`);\n } catch (err: any) {\n logger.error(\n `working directory ${workingDirectory} ${\n err.code === 'ENOENT' ? 'does not exist' : 'is not writable'\n }`,\n );\n throw err;\n }\n return workingDirectory;\n}\n\nexport async function executeWithRetry(\n action: () => Promise<Response>,\n maxErrors = 15,\n): Promise<Response> {\n let response: Response;\n let errorCount = 0;\n // execute with retry\n const backoff = 5000;\n while (errorCount < maxErrors) {\n try {\n response = await action();\n if (response.status >= 400) {\n errorCount++;\n // backoff\n await delay(backoff);\n } else {\n return response;\n }\n } catch (e) {\n errorCount++;\n await delay(backoff);\n }\n }\n throw new Error('Unable to execute query.');\n}\n\nexport function delay(time: number) {\n return new Promise(r => setTimeout(r, time));\n}\n"],"names":[],"mappings":";;;;;AAuBA,eAAsB,mBAAsB,IAAA,EAI7B;AACb,EAAA,IAAI,MAAA;AACJ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,aAAa,CAAA,EAAA,EAAK;AACzC,IAAA,MAAA,GAAS,MAAM,KAAK,OAAA,EAAQ;AAC5B,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,WAAW,OAAA,EAAS,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EAChE;AACA,EAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AACzE;AA0BA,eAAsB,gBAAA,CACpB,MAAA,EACA,SAAA,GAAY,EAAA,EACO;AACnB,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,MAAM,OAAA,GAAU,GAAA;AAChB,EAAA,OAAO,aAAa,SAAA,EAAW;AAC7B,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,MAAA,EAAO;AACxB,MAAA,IAAI,QAAA,CAAS,UAAU,GAAA,EAAK;AAC1B,QAAA,UAAA,EAAA;AAEA,QAAA,MAAM,MAAM,OAAO,CAAA;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,UAAA,EAAA;AACA,MAAA,MAAM,MAAM,OAAO,CAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAC5C;AAEO,SAAS,MAAM,IAAA,EAAc;AAClC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAA,CAAA,KAAK,UAAA,CAAW,CAAA,EAAG,IAAI,CAAC,CAAA;AAC7C;;;;;;"}
1
+ {"version":3,"file":"Helper.cjs.js","sources":["../../src/service/Helper.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 type { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\n\nimport fs from 'fs-extra';\n\nimport {\n ProcessInstance,\n ProcessInstanceState,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport os from 'os';\n\nexport async function retryAsyncFunction<T>(args: {\n asyncFn: () => Promise<T | undefined>;\n maxAttempts: number;\n delayMs: number;\n}): Promise<T> {\n let result: T | undefined;\n for (let i = 0; i < args.maxAttempts; i++) {\n result = await args.asyncFn();\n if (result !== undefined) {\n return result;\n }\n await new Promise(resolve => setTimeout(resolve, args.delayMs));\n }\n throw new Error('Exceeded maximum number of retries for async function');\n}\n\nexport async function getWorkingDirectory(\n config: Config,\n logger: LoggerService,\n): Promise<string> {\n if (!config.has('backend.workingDirectory')) {\n return os.tmpdir();\n }\n\n const workingDirectory = config.getString('backend.workingDirectory');\n try {\n // Check if working directory exists and is writable\n await fs.access(workingDirectory, fs.constants.F_OK | fs.constants.W_OK);\n logger.info(`using working directory: ${workingDirectory}`);\n } catch (err: any) {\n logger.error(\n `working directory ${workingDirectory} ${\n err.code === 'ENOENT' ? 'does not exist' : 'is not writable'\n }`,\n );\n throw err;\n }\n return workingDirectory;\n}\n\nexport async function executeWithRetry(\n action: () => Promise<Response>,\n maxErrors = 15,\n): Promise<Response> {\n let response: Response;\n let errorCount = 0;\n // execute with retry\n const backoff = 5000;\n while (errorCount < maxErrors) {\n try {\n response = await action();\n if (response.status >= 400) {\n errorCount++;\n // backoff\n await delay(backoff);\n } else {\n return response;\n }\n } catch (e) {\n errorCount++;\n await delay(backoff);\n }\n }\n throw new Error('Unable to execute query.');\n}\n\nexport function delay(time: number) {\n return new Promise(r => setTimeout(r, time));\n}\n\nexport function groupByProcessIdAndVersion(instances: ProcessInstance[]) {\n return instances.reduce<Record<string, ProcessInstance[]>>((acc, item) => {\n acc[`${item.processId}-${item.version}`] ??= [];\n acc[`${item.processId}-${item.version}`].push(item);\n return acc;\n }, {});\n}\n\nexport type WorkflowRunStatsResult = {\n processIdVersion: string;\n successCount: number;\n errorCount: number;\n totalCount: number;\n successRatio: number;\n runsLastMonth: number;\n averageTimeToComplete: number;\n};\n\nexport function getWorkflowRunStats(\n groupedData: Record<string, ProcessInstance[]>,\n): WorkflowRunStatsResult[] {\n return Object.entries(groupedData).map(([processIdVersion, items]) => {\n const averageTimeToComplete =\n items.reduce((acc, item) => {\n return (\n acc +\n (item.end && item.start\n ? new Date(item.end).getTime() - new Date(item.start).getTime()\n : 0)\n );\n }, 0) / items.length;\n const successCount = items.filter(\n item => item.state === ProcessInstanceState.Completed,\n ).length;\n const errorCount = items.filter(\n item => item.state === ProcessInstanceState.Error,\n ).length;\n const runsLastMonth = items.filter(\n item =>\n item.start &&\n new Date(item.start) > new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),\n );\n return {\n processIdVersion,\n successCount,\n errorCount,\n totalCount: successCount + errorCount,\n successRatio: successCount / (successCount + errorCount),\n runsLastMonth: runsLastMonth.length,\n averageTimeToComplete,\n };\n });\n}\n"],"names":["ProcessInstanceState"],"mappings":"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"}
@@ -5,6 +5,7 @@ var kafkajs = require('kafkajs');
5
5
  var capitalize = require('lodash/capitalize');
6
6
  var backstagePluginOrchestratorCommon = require('@red-hat-developer-hub/backstage-plugin-orchestrator-common');
7
7
  var node_crypto = require('node:crypto');
8
+ var Helper = require('./Helper.cjs.js');
8
9
 
9
10
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
10
11
 
@@ -70,12 +71,42 @@ class SonataFlowService {
70
71
  if (!workflowInfos?.length) {
71
72
  return [];
72
73
  }
74
+ const statsDefinitionIds = workflowInfos.map((info) => info.id);
75
+ const instancesFilter = targetEntity ? {
76
+ field: "variables",
77
+ nested: {
78
+ operator: "EQ",
79
+ field: "targetEntity",
80
+ value: targetEntity
81
+ }
82
+ } : void 0;
83
+ const instances = await this.dataIndexService.fetchInstances({
84
+ definitionIds: statsDefinitionIds,
85
+ filter: instancesFilter
86
+ });
87
+ const groupedData = Helper.groupByProcessIdAndVersion(instances);
88
+ const worflowInstanceStats = Helper.getWorkflowRunStats(groupedData);
73
89
  const items = await Promise.all(
74
90
  workflowInfos.filter((info) => info.source).map(
75
91
  (info) => this.fetchWorkflowOverviewBySource(info.source, targetEntity)
76
92
  )
77
93
  );
78
- return items.filter((item) => !!item);
94
+ return items.filter((item) => !!item).map((overview) => {
95
+ const stats = worflowInstanceStats.find(
96
+ (stat) => stat.processIdVersion === `${overview.workflowId}-${overview.version}`
97
+ );
98
+ if (stats) {
99
+ overview.workflowRunStats = {
100
+ successRatio: stats.successRatio,
101
+ runsLastMonth: stats.runsLastMonth,
102
+ successCount: stats.successCount,
103
+ errorCount: stats.errorCount,
104
+ totalCount: stats.totalCount,
105
+ averageTimeToComplete: stats.averageTimeToComplete
106
+ };
107
+ }
108
+ return overview;
109
+ });
79
110
  }
80
111
  async executeWorkflowAsCloudEvent(args) {
81
112
  if (!this.orchestratorKafkaImpl) {
@@ -247,7 +278,28 @@ class SonataFlowService {
247
278
  this.logger.debug(`Workflow source not found: ${definitionId}`);
248
279
  return void 0;
249
280
  }
250
- return await this.fetchWorkflowOverviewBySource(source);
281
+ const instances = await this.dataIndexService.fetchInstances({
282
+ definitionIds: [definitionId]
283
+ });
284
+ const groupedData = Helper.groupByProcessIdAndVersion(instances);
285
+ const worflowInstanceStats = Helper.getWorkflowRunStats(groupedData);
286
+ const workflowOverview = await this.fetchWorkflowOverviewBySource(source);
287
+ if (workflowOverview) {
288
+ const stats = worflowInstanceStats.find(
289
+ (stat) => stat.processIdVersion === `${workflowOverview.workflowId}-${workflowOverview.version}`
290
+ );
291
+ if (stats) {
292
+ workflowOverview.workflowRunStats = {
293
+ successRatio: stats.successRatio,
294
+ runsLastMonth: stats.runsLastMonth,
295
+ successCount: stats.successCount,
296
+ errorCount: stats.errorCount,
297
+ totalCount: stats.totalCount,
298
+ averageTimeToComplete: stats.averageTimeToComplete
299
+ };
300
+ }
301
+ }
302
+ return workflowOverview;
251
303
  }
252
304
  async fetchWorkflowOverviewBySource(source, targetEntity) {
253
305
  let lastTriggered = /* @__PURE__ */ new Date(0);
@@ -1 +1 @@
1
- {"version":3,"file":"SonataFlowService.cjs.js","sources":["../../src/service/SonataFlowService.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 { CloudEvent, Kafka as KafkaCE } from 'cloudevents';\nimport { Kafka } from 'kafkajs';\nimport capitalize from 'lodash/capitalize';\n\nimport {\n AuthToken,\n extractWorkflowFormat,\n Filter,\n fromWorkflowSource,\n ProcessInstanceStateValues,\n ProcessInstanceVariables,\n WorkflowDefinition,\n WorkflowExecutionResponse,\n WorkflowInfo,\n WorkflowOverview,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { randomUUID } from 'node:crypto';\n\nimport { OrchestratorKafkaServiceOptions } from '../types/kafka';\nimport { Pagination } from '../types/pagination';\nimport { DataIndexService } from './DataIndexService';\n\nexport class SonataFlowService {\n private readonly orchestratorKafkaImpl?: Kafka;\n private readonly orchestratorKafkaMessageKey?: string;\n constructor(\n private readonly dataIndexService: DataIndexService,\n private readonly logger: LoggerService,\n private readonly kafkaServiceOptions?: OrchestratorKafkaServiceOptions,\n ) {\n // If there are kafkaServiceOptions, then do the implemntation\n if (this.kafkaServiceOptions) {\n this.orchestratorKafkaMessageKey =\n this.kafkaServiceOptions.messageKey ?? '';\n this.logger.debug(\n `creating orchestrator kafka implementation with options: clientId: ${this.kafkaServiceOptions.clientId} and brokers: ${JSON.stringify(this.kafkaServiceOptions.brokers)}`,\n );\n // It looks like that the community plugin just passes the whole options from the app-config to the kafkajs constructor\n this.orchestratorKafkaImpl = new Kafka(this.kafkaServiceOptions);\n }\n }\n\n getOrchestratorKafkaImpl() {\n return this.orchestratorKafkaImpl;\n }\n\n public async fetchWorkflowInfoOnService(args: {\n definitionId: string;\n serviceUrl: string;\n }): Promise<WorkflowInfo | undefined> {\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}`;\n let response: Response | undefined;\n try {\n response = await fetch(urlToFetch);\n } catch (error) {\n this.logger.error(\n `Failed to fetch from ${urlToFetch}: ${(error as Error).message}`,\n );\n }\n\n const jsonResponse = await this.handleWorkflowServiceResponse(\n 'Get workflow info',\n args.definitionId,\n urlToFetch,\n response,\n 'GET',\n );\n this.logger.debug(\n `Fetch workflow info result: ${JSON.stringify(jsonResponse)}`,\n );\n return jsonResponse;\n }\n\n public async fetchWorkflowDefinition(\n definitionId: string,\n ): Promise<WorkflowDefinition | undefined> {\n const source =\n await this.dataIndexService.fetchWorkflowSource(definitionId);\n if (source) {\n return fromWorkflowSource(source);\n }\n return undefined;\n }\n\n public async fetchWorkflowOverviews(args: {\n definitionIds?: string[];\n pagination?: Pagination;\n filter?: Filter;\n targetEntity?: string;\n }): Promise<WorkflowOverview[] | undefined> {\n const { definitionIds, pagination, filter, targetEntity } = args;\n const workflowInfos = await this.dataIndexService.fetchWorkflowInfos({\n definitionIds,\n pagination,\n filter,\n });\n if (!workflowInfos?.length) {\n return [];\n }\n const items = await Promise.all(\n workflowInfos\n .filter(info => info.source)\n .map(info =>\n this.fetchWorkflowOverviewBySource(info.source!, targetEntity),\n ),\n );\n return items.filter((item): item is WorkflowOverview => !!item);\n }\n\n public async executeWorkflowAsCloudEvent(args: {\n definitionId: string;\n workflowSource: string;\n workflowEventType: string;\n contextAttribute: string;\n inputData?: ProcessInstanceVariables;\n authTokens?: Array<AuthToken>;\n backstageToken?: string;\n }): Promise<WorkflowExecutionResponse | undefined> {\n if (!this.orchestratorKafkaImpl) {\n this.logger.error('No Orchestrator kafka implementation added');\n throw new Error('No Orchestrator kafka implementation added');\n }\n const contextAttributeId = randomUUID();\n // The data that needs to be part of the clouevent data is in the workflowdata key.\n // We need to spread the workflowdata payload into the clouevent data,\n // which is slighty different than a regular workflow execution.\n // We also need to remove the isEvent value from the workflowdata payload.\n const rawWorkflowdata = args.inputData?.workflowdata;\n let workflowdataPayload: Record<string, unknown> = {};\n if (\n typeof rawWorkflowdata === 'object' &&\n rawWorkflowdata !== null &&\n !Array.isArray(rawWorkflowdata)\n ) {\n workflowdataPayload = {\n ...(rawWorkflowdata as Record<string, unknown>),\n };\n if (workflowdataPayload.isEvent) {\n delete workflowdataPayload.isEvent;\n }\n }\n const triggeringCloudEvent = new CloudEvent({\n datacontenttype: 'application/json',\n type: args.workflowEventType,\n source: args.workflowSource,\n [args.contextAttribute]: contextAttributeId,\n data: {\n ...workflowdataPayload,\n [args.contextAttribute]: contextAttributeId, // Need this to be able to correlate the workflow run somehow\n },\n });\n\n // Put the CE in the format needed to send as a Kafka message\n const lockEventBinding = KafkaCE.binary(triggeringCloudEvent);\n // Create the message event that will be sent to the kafka topic\n const messageEvent = {\n key: this.orchestratorKafkaMessageKey,\n value: JSON.stringify(KafkaCE.toEvent(lockEventBinding)),\n };\n\n const kfk = this.orchestratorKafkaImpl;\n const producer = kfk.producer();\n try {\n // Connect the producer\n await producer.connect();\n\n // Send the message\n await producer.send({\n topic: args.workflowEventType,\n messages: [messageEvent],\n });\n } catch (error) {\n this.logger.error(\n `Error with Kafka client connection. Options: clientId: ${this.kafkaServiceOptions?.clientId} and broker: ${JSON.stringify(this.kafkaServiceOptions?.brokers)}`,\n );\n throw new Error(\n `Error with Kafka client with connection Options: clientId: ${this.kafkaServiceOptions?.clientId} and broker: ${JSON.stringify(this.kafkaServiceOptions?.brokers)}`,\n );\n } finally {\n // Disconnect the producer\n await producer.disconnect();\n }\n\n // Since sending to kafka doesn't return anything, send back the contextAttributeId here\n // Then we will query the workflow instances to see if it showed up yet\n return {\n id: contextAttributeId,\n };\n }\n\n public async executeWorkflow(args: {\n definitionId: string;\n serviceUrl: string;\n inputData?: ProcessInstanceVariables;\n authTokens?: Array<AuthToken>;\n backstageToken?: string | undefined;\n }): Promise<WorkflowExecutionResponse | undefined> {\n const urlToFetch = `${args.serviceUrl}/${args.definitionId}`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n this.addAuthHeaders(headers, args.authTokens, args.backstageToken);\n const headerKeys = Object.keys(headers);\n this.logger.info(\n `Executing workflow ${args.definitionId} with headers: ${headerKeys.join(', ')}`,\n );\n\n let response: Response | undefined;\n try {\n response = await fetch(urlToFetch, {\n method: 'POST',\n body: JSON.stringify(args.inputData || {}),\n headers,\n });\n } catch (error) {\n this.logger.error(\n `Failed to fetch from ${urlToFetch}: ${(error as Error).message}`,\n );\n }\n\n const json = await this.handleWorkflowServiceResponse(\n 'Execute',\n args.definitionId,\n urlToFetch,\n response,\n 'POST',\n );\n if (json.id) {\n this.logger.debug(\n `Execute workflow successful. Response: ${JSON.stringify(json)}`,\n );\n return json;\n }\n this.logger.error(\n `Execute workflow did not return a workflow instance ID. Response: ${JSON.stringify(\n json,\n )}`,\n );\n throw new Error('Execute workflow did not return a workflow instance ID');\n }\n\n private addAuthHeaders(\n headers: Record<string, string>,\n authTokens?: Array<AuthToken>,\n backstageToken?: string | undefined,\n ) {\n // Add X-Authentication headers from authTokens\n if (authTokens && Array.isArray(authTokens)) {\n authTokens.forEach(tokenObj => {\n if (tokenObj.provider && tokenObj.token) {\n const headerKey = `X-Authorization-${capitalize(tokenObj.provider)}`;\n headers[headerKey] = String(tokenObj.token); // Ensure token is a string\n }\n });\n } else {\n this.logger.debug(\n 'No authTokens provided or authTokens is not an array.',\n );\n }\n\n if (backstageToken) {\n const headerKey = 'X-Authorization-Backstage';\n headers[headerKey] = backstageToken;\n }\n }\n\n public async retriggerInstance(args: {\n definitionId: string;\n instanceId: string;\n serviceUrl: string;\n authTokens?: Array<AuthToken>;\n backstageToken?: string | undefined;\n }): Promise<boolean> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n this.addAuthHeaders(headers, args.authTokens, args.backstageToken);\n const headerKeys = Object.keys(headers);\n this.logger.info(\n `Retriggering workflow ${args.definitionId} with headers: ${headerKeys.join(', ')}`,\n );\n\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}/instances/${args.instanceId}/retrigger`;\n\n let response: Response | undefined;\n try {\n response = await fetch(urlToFetch, {\n method: 'POST',\n headers,\n });\n } catch (error) {\n this.logger.error(\n `Failed to fetch from ${urlToFetch}: ${(error as Error).message}`,\n );\n }\n\n await this.handleWorkflowServiceResponse(\n 'Retrigger',\n args.definitionId,\n urlToFetch,\n response,\n 'POST',\n );\n\n return true;\n }\n\n public async abortInstance(args: {\n definitionId: string;\n instanceId: string;\n serviceUrl: string;\n }): Promise<void> {\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}/instances/${args.instanceId}`;\n\n let response: Response | undefined;\n try {\n response = await fetch(urlToFetch, {\n method: 'DELETE',\n });\n } catch (error) {\n this.logger.error(\n `Failed to fetch from ${urlToFetch}: ${(error as Error).message}`,\n );\n }\n\n await this.handleWorkflowServiceResponse(\n 'Abort',\n args.definitionId,\n urlToFetch,\n response,\n 'DELETE',\n );\n }\n\n public async fetchWorkflowOverview(\n definitionId: string,\n ): Promise<WorkflowOverview | undefined> {\n const source =\n await this.dataIndexService.fetchWorkflowSource(definitionId);\n if (!source) {\n this.logger.debug(`Workflow source not found: ${definitionId}`);\n return undefined;\n }\n return await this.fetchWorkflowOverviewBySource(source);\n }\n\n private async fetchWorkflowOverviewBySource(\n source: string,\n targetEntity?: string,\n ): Promise<WorkflowOverview | undefined> {\n let lastTriggered: Date = new Date(0);\n let lastRunStatus: ProcessInstanceStateValues | undefined;\n let lastRunId: string | undefined;\n const definition = fromWorkflowSource(source);\n\n const processInstances =\n await this.dataIndexService.fetchInstancesByDefinitionId({\n definitionId: definition.id,\n limit: 1,\n offset: 0,\n targetEntity: targetEntity,\n });\n\n const pInstance = processInstances[0];\n\n if (pInstance?.start) {\n lastRunId = pInstance.id;\n lastTriggered = new Date(pInstance.start);\n lastRunStatus = pInstance.state;\n }\n\n return {\n workflowId: definition.id,\n name: definition.name,\n format: extractWorkflowFormat(source),\n lastRunId,\n lastTriggeredMs: lastTriggered.getTime(),\n lastRunStatus,\n description: definition.description,\n version: definition.version,\n };\n }\n\n public async pingWorkflowService(args: {\n definitionId: string;\n serviceUrl: string;\n }): Promise<boolean> {\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}`;\n let response: Response | undefined;\n try {\n response = await fetch(urlToFetch);\n } catch (error) {\n this.logger.error(\n `Failed to fetch from ${urlToFetch}: ${(error as Error).message}`,\n );\n return false;\n }\n return response.ok;\n }\n\n private async handleWorkflowServiceResponse(\n operation: 'Abort' | 'Execute' | 'Retrigger' | 'Get workflow info',\n workflowId: string,\n urlToFetch: string,\n response: Response | undefined,\n httpMethod: Request['method'],\n ): Promise<any> {\n const logErrorPrefix = `Error during operation '${operation}' on workflow ${workflowId} with service URL ${urlToFetch}`;\n if (!response) {\n throw new Error(`${logErrorPrefix} : fetch failed`);\n }\n const errorLines: string[] = [];\n errorLines.push(`HTTP ${httpMethod} request to ${urlToFetch} failed.`);\n errorLines.push(`Status Code: ${response.status}`);\n if (response.statusText) {\n errorLines.push(`Status Text: ${response.statusText}`);\n }\n try {\n const jsonResponse = await response.json();\n if ((jsonResponse.id && operation === 'Execute') || response.ok) {\n // Treat as successful from the UI perspective.\n // This allows navigation to the instance page even if the workflow execution\n // fails immediately after initiation. The presence of an instance id or a successful\n // 'ok' status indicates the initiation was successful.\n return jsonResponse;\n }\n if (jsonResponse?.message) {\n errorLines.push(`Message: ${jsonResponse.message}`);\n }\n if (jsonResponse?.details) {\n errorLines.push(`Details: ${jsonResponse.details}`);\n }\n if (jsonResponse?.stack) {\n errorLines.push(`Stack Trace: ${jsonResponse.stack}`);\n }\n if (jsonResponse?.failedNodeId) {\n errorLines.push(`Failed Node ID: ${jsonResponse.failedNodeId}`);\n }\n this.logger.error(`${logErrorPrefix}: ${JSON.stringify(jsonResponse)}`);\n } catch (jsonParseError) {\n this.logger.error(\n `${logErrorPrefix}. The details of this error cannot be provided because the response body was not in a parsable format.`,\n );\n }\n throw new Error(errorLines.join('\\n'));\n }\n}\n"],"names":["Kafka","fromWorkflowSource","randomUUID","CloudEvent","KafkaCE","capitalize","extractWorkflowFormat"],"mappings":"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"}
1
+ {"version":3,"file":"SonataFlowService.cjs.js","sources":["../../src/service/SonataFlowService.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 { CloudEvent, Kafka as KafkaCE } from 'cloudevents';\nimport { Kafka } from 'kafkajs';\nimport capitalize from 'lodash/capitalize';\n\nimport {\n AuthToken,\n extractWorkflowFormat,\n Filter,\n fromWorkflowSource,\n ProcessInstanceStateValues,\n ProcessInstanceVariables,\n WorkflowDefinition,\n WorkflowExecutionResponse,\n WorkflowInfo,\n WorkflowOverview,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { randomUUID } from 'node:crypto';\n\nimport { OrchestratorKafkaServiceOptions } from '../types/kafka';\nimport { Pagination } from '../types/pagination';\nimport { DataIndexService } from './DataIndexService';\nimport { getWorkflowRunStats, groupByProcessIdAndVersion } from './Helper';\n\nexport class SonataFlowService {\n private readonly orchestratorKafkaImpl?: Kafka;\n private readonly orchestratorKafkaMessageKey?: string;\n constructor(\n private readonly dataIndexService: DataIndexService,\n private readonly logger: LoggerService,\n private readonly kafkaServiceOptions?: OrchestratorKafkaServiceOptions,\n ) {\n // If there are kafkaServiceOptions, then do the implemntation\n if (this.kafkaServiceOptions) {\n this.orchestratorKafkaMessageKey =\n this.kafkaServiceOptions.messageKey ?? '';\n this.logger.debug(\n `creating orchestrator kafka implementation with options: clientId: ${this.kafkaServiceOptions.clientId} and brokers: ${JSON.stringify(this.kafkaServiceOptions.brokers)}`,\n );\n // It looks like that the community plugin just passes the whole options from the app-config to the kafkajs constructor\n this.orchestratorKafkaImpl = new Kafka(this.kafkaServiceOptions);\n }\n }\n\n getOrchestratorKafkaImpl() {\n return this.orchestratorKafkaImpl;\n }\n\n public async fetchWorkflowInfoOnService(args: {\n definitionId: string;\n serviceUrl: string;\n }): Promise<WorkflowInfo | undefined> {\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}`;\n let response: Response | undefined;\n try {\n response = await fetch(urlToFetch);\n } catch (error) {\n this.logger.error(\n `Failed to fetch from ${urlToFetch}: ${(error as Error).message}`,\n );\n }\n\n const jsonResponse = await this.handleWorkflowServiceResponse(\n 'Get workflow info',\n args.definitionId,\n urlToFetch,\n response,\n 'GET',\n );\n this.logger.debug(\n `Fetch workflow info result: ${JSON.stringify(jsonResponse)}`,\n );\n return jsonResponse;\n }\n\n public async fetchWorkflowDefinition(\n definitionId: string,\n ): Promise<WorkflowDefinition | undefined> {\n const source =\n await this.dataIndexService.fetchWorkflowSource(definitionId);\n if (source) {\n return fromWorkflowSource(source);\n }\n return undefined;\n }\n\n public async fetchWorkflowOverviews(args: {\n definitionIds?: string[];\n pagination?: Pagination;\n filter?: Filter;\n targetEntity?: string;\n }): Promise<WorkflowOverview[] | undefined> {\n const { definitionIds, pagination, filter, targetEntity } = args;\n const workflowInfos = await this.dataIndexService.fetchWorkflowInfos({\n definitionIds,\n pagination,\n filter,\n });\n if (!workflowInfos?.length) {\n return [];\n }\n\n const statsDefinitionIds = workflowInfos.map(info => info.id);\n const instancesFilter: Filter | undefined = targetEntity\n ? {\n field: 'variables',\n nested: {\n operator: 'EQ',\n field: 'targetEntity',\n value: targetEntity,\n },\n }\n : undefined;\n\n // Fetch instances by workflow definition id. Do not reuse the overview\n // filter here: entity overview passes `id IN [workflowIds]`, which applies\n // to definitions but would match instance ids when querying instances.\n const instances = await this.dataIndexService.fetchInstances({\n definitionIds: statsDefinitionIds,\n filter: instancesFilter,\n });\n\n // This will have all the workflows, so we need to group by workflow id\n // and then we can get the success ratio for each workflow\n // And also find the amount of runs for the 30 day window\n\n // First we ned to group the data by processId and version\n // Result will look something like this:\n /**\n * {\n * 'workflowId-version': [processInstance1, processInstance2, ...],\n * 'workflowId-version': [processInstance1, processInstance2, ...],\n * ...\n * }\n */\n const groupedData = groupByProcessIdAndVersion(instances);\n\n // Then we need to calculate the success rate for each processId and get the amount of runs for the last 30 days\n // Result will look something like this:\n /**\n [\n {\n processIdVersion: 'quarkus-backend-1.0',\n successCount: 1,\n errorCount: 0,\n totalCount: 1,\n successRatio: 1,\n runsLastMonth: 1\n },\n {\n processIdVersion: 'random-success-or-error-1.0',\n successCount: 1,\n errorCount: 1,\n totalCount: 2,\n successRatio: 0.5833333333333334,\n runsLastMonth: 12\n }\n ]\n */\n const worflowInstanceStats = getWorkflowRunStats(groupedData);\n\n const items = await Promise.all(\n workflowInfos\n .filter(info => info.source)\n .map(info =>\n this.fetchWorkflowOverviewBySource(info.source!, targetEntity),\n ),\n );\n\n return items\n .filter((item): item is WorkflowOverview => !!item)\n .map(overview => {\n const stats = worflowInstanceStats.find(\n stat =>\n stat.processIdVersion ===\n `${overview.workflowId}-${overview.version}`,\n );\n if (stats) {\n overview.workflowRunStats = {\n successRatio: stats.successRatio,\n runsLastMonth: stats.runsLastMonth,\n successCount: stats.successCount,\n errorCount: stats.errorCount,\n totalCount: stats.totalCount,\n averageTimeToComplete: stats.averageTimeToComplete,\n };\n }\n return overview;\n });\n }\n\n public async executeWorkflowAsCloudEvent(args: {\n definitionId: string;\n workflowSource: string;\n workflowEventType: string;\n contextAttribute: string;\n inputData?: ProcessInstanceVariables;\n authTokens?: Array<AuthToken>;\n backstageToken?: string;\n }): Promise<WorkflowExecutionResponse | undefined> {\n if (!this.orchestratorKafkaImpl) {\n this.logger.error('No Orchestrator kafka implementation added');\n throw new Error('No Orchestrator kafka implementation added');\n }\n const contextAttributeId = randomUUID();\n // The data that needs to be part of the clouevent data is in the workflowdata key.\n // We need to spread the workflowdata payload into the clouevent data,\n // which is slighty different than a regular workflow execution.\n // We also need to remove the isEvent value from the workflowdata payload.\n const rawWorkflowdata = args.inputData?.workflowdata;\n let workflowdataPayload: Record<string, unknown> = {};\n if (\n typeof rawWorkflowdata === 'object' &&\n rawWorkflowdata !== null &&\n !Array.isArray(rawWorkflowdata)\n ) {\n workflowdataPayload = {\n ...(rawWorkflowdata as Record<string, unknown>),\n };\n if (workflowdataPayload.isEvent) {\n delete workflowdataPayload.isEvent;\n }\n }\n const triggeringCloudEvent = new CloudEvent({\n datacontenttype: 'application/json',\n type: args.workflowEventType,\n source: args.workflowSource,\n [args.contextAttribute]: contextAttributeId,\n data: {\n ...workflowdataPayload,\n [args.contextAttribute]: contextAttributeId, // Need this to be able to correlate the workflow run somehow\n },\n });\n\n // Put the CE in the format needed to send as a Kafka message\n const lockEventBinding = KafkaCE.binary(triggeringCloudEvent);\n // Create the message event that will be sent to the kafka topic\n const messageEvent = {\n key: this.orchestratorKafkaMessageKey,\n value: JSON.stringify(KafkaCE.toEvent(lockEventBinding)),\n };\n\n const kfk = this.orchestratorKafkaImpl;\n const producer = kfk.producer();\n try {\n // Connect the producer\n await producer.connect();\n\n // Send the message\n await producer.send({\n topic: args.workflowEventType,\n messages: [messageEvent],\n });\n } catch (error) {\n this.logger.error(\n `Error with Kafka client connection. Options: clientId: ${this.kafkaServiceOptions?.clientId} and broker: ${JSON.stringify(this.kafkaServiceOptions?.brokers)}`,\n );\n throw new Error(\n `Error with Kafka client with connection Options: clientId: ${this.kafkaServiceOptions?.clientId} and broker: ${JSON.stringify(this.kafkaServiceOptions?.brokers)}`,\n );\n } finally {\n // Disconnect the producer\n await producer.disconnect();\n }\n\n // Since sending to kafka doesn't return anything, send back the contextAttributeId here\n // Then we will query the workflow instances to see if it showed up yet\n return {\n id: contextAttributeId,\n };\n }\n\n public async executeWorkflow(args: {\n definitionId: string;\n serviceUrl: string;\n inputData?: ProcessInstanceVariables;\n authTokens?: Array<AuthToken>;\n backstageToken?: string | undefined;\n }): Promise<WorkflowExecutionResponse | undefined> {\n const urlToFetch = `${args.serviceUrl}/${args.definitionId}`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n this.addAuthHeaders(headers, args.authTokens, args.backstageToken);\n const headerKeys = Object.keys(headers);\n this.logger.info(\n `Executing workflow ${args.definitionId} with headers: ${headerKeys.join(', ')}`,\n );\n\n let response: Response | undefined;\n try {\n response = await fetch(urlToFetch, {\n method: 'POST',\n body: JSON.stringify(args.inputData || {}),\n headers,\n });\n } catch (error) {\n this.logger.error(\n `Failed to fetch from ${urlToFetch}: ${(error as Error).message}`,\n );\n }\n\n const json = await this.handleWorkflowServiceResponse(\n 'Execute',\n args.definitionId,\n urlToFetch,\n response,\n 'POST',\n );\n if (json.id) {\n this.logger.debug(\n `Execute workflow successful. Response: ${JSON.stringify(json)}`,\n );\n return json;\n }\n this.logger.error(\n `Execute workflow did not return a workflow instance ID. Response: ${JSON.stringify(\n json,\n )}`,\n );\n throw new Error('Execute workflow did not return a workflow instance ID');\n }\n\n private addAuthHeaders(\n headers: Record<string, string>,\n authTokens?: Array<AuthToken>,\n backstageToken?: string | undefined,\n ) {\n // Add X-Authentication headers from authTokens\n if (authTokens && Array.isArray(authTokens)) {\n authTokens.forEach(tokenObj => {\n if (tokenObj.provider && tokenObj.token) {\n const headerKey = `X-Authorization-${capitalize(tokenObj.provider)}`;\n headers[headerKey] = String(tokenObj.token); // Ensure token is a string\n }\n });\n } else {\n this.logger.debug(\n 'No authTokens provided or authTokens is not an array.',\n );\n }\n\n if (backstageToken) {\n const headerKey = 'X-Authorization-Backstage';\n headers[headerKey] = backstageToken;\n }\n }\n\n public async retriggerInstance(args: {\n definitionId: string;\n instanceId: string;\n serviceUrl: string;\n authTokens?: Array<AuthToken>;\n backstageToken?: string | undefined;\n }): Promise<boolean> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n this.addAuthHeaders(headers, args.authTokens, args.backstageToken);\n const headerKeys = Object.keys(headers);\n this.logger.info(\n `Retriggering workflow ${args.definitionId} with headers: ${headerKeys.join(', ')}`,\n );\n\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}/instances/${args.instanceId}/retrigger`;\n\n let response: Response | undefined;\n try {\n response = await fetch(urlToFetch, {\n method: 'POST',\n headers,\n });\n } catch (error) {\n this.logger.error(\n `Failed to fetch from ${urlToFetch}: ${(error as Error).message}`,\n );\n }\n\n await this.handleWorkflowServiceResponse(\n 'Retrigger',\n args.definitionId,\n urlToFetch,\n response,\n 'POST',\n );\n\n return true;\n }\n\n public async abortInstance(args: {\n definitionId: string;\n instanceId: string;\n serviceUrl: string;\n }): Promise<void> {\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}/instances/${args.instanceId}`;\n\n let response: Response | undefined;\n try {\n response = await fetch(urlToFetch, {\n method: 'DELETE',\n });\n } catch (error) {\n this.logger.error(\n `Failed to fetch from ${urlToFetch}: ${(error as Error).message}`,\n );\n }\n\n await this.handleWorkflowServiceResponse(\n 'Abort',\n args.definitionId,\n urlToFetch,\n response,\n 'DELETE',\n );\n }\n\n public async fetchWorkflowOverview(\n definitionId: string,\n ): Promise<WorkflowOverview | undefined> {\n const source =\n await this.dataIndexService.fetchWorkflowSource(definitionId);\n if (!source) {\n this.logger.debug(`Workflow source not found: ${definitionId}`);\n return undefined;\n }\n\n // Can reuse the instances to get the stats\n const instances = await this.dataIndexService.fetchInstances({\n definitionIds: [definitionId],\n });\n const groupedData = groupByProcessIdAndVersion(instances);\n const worflowInstanceStats = getWorkflowRunStats(groupedData);\n const workflowOverview = await this.fetchWorkflowOverviewBySource(source);\n if (workflowOverview) {\n const stats = worflowInstanceStats.find(\n stat =>\n stat.processIdVersion ===\n `${workflowOverview.workflowId}-${workflowOverview.version}`,\n );\n if (stats) {\n workflowOverview.workflowRunStats = {\n successRatio: stats.successRatio,\n runsLastMonth: stats.runsLastMonth,\n successCount: stats.successCount,\n errorCount: stats.errorCount,\n totalCount: stats.totalCount,\n averageTimeToComplete: stats.averageTimeToComplete,\n };\n }\n }\n return workflowOverview;\n }\n\n private async fetchWorkflowOverviewBySource(\n source: string,\n targetEntity?: string,\n ): Promise<WorkflowOverview | undefined> {\n let lastTriggered: Date = new Date(0);\n let lastRunStatus: ProcessInstanceStateValues | undefined;\n let lastRunId: string | undefined;\n const definition = fromWorkflowSource(source);\n\n const processInstances =\n await this.dataIndexService.fetchInstancesByDefinitionId({\n definitionId: definition.id,\n limit: 1,\n offset: 0,\n targetEntity: targetEntity,\n });\n\n const pInstance = processInstances[0];\n\n if (pInstance?.start) {\n lastRunId = pInstance.id;\n lastTriggered = new Date(pInstance.start);\n lastRunStatus = pInstance.state;\n }\n\n return {\n workflowId: definition.id,\n name: definition.name,\n format: extractWorkflowFormat(source),\n lastRunId,\n lastTriggeredMs: lastTriggered.getTime(),\n lastRunStatus,\n description: definition.description,\n version: definition.version,\n };\n }\n\n public async pingWorkflowService(args: {\n definitionId: string;\n serviceUrl: string;\n }): Promise<boolean> {\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}`;\n let response: Response | undefined;\n try {\n response = await fetch(urlToFetch);\n } catch (error) {\n this.logger.error(\n `Failed to fetch from ${urlToFetch}: ${(error as Error).message}`,\n );\n return false;\n }\n return response.ok;\n }\n\n private async handleWorkflowServiceResponse(\n operation: 'Abort' | 'Execute' | 'Retrigger' | 'Get workflow info',\n workflowId: string,\n urlToFetch: string,\n response: Response | undefined,\n httpMethod: Request['method'],\n ): Promise<any> {\n const logErrorPrefix = `Error during operation '${operation}' on workflow ${workflowId} with service URL ${urlToFetch}`;\n if (!response) {\n throw new Error(`${logErrorPrefix} : fetch failed`);\n }\n const errorLines: string[] = [];\n errorLines.push(`HTTP ${httpMethod} request to ${urlToFetch} failed.`);\n errorLines.push(`Status Code: ${response.status}`);\n if (response.statusText) {\n errorLines.push(`Status Text: ${response.statusText}`);\n }\n try {\n const jsonResponse = await response.json();\n if ((jsonResponse.id && operation === 'Execute') || response.ok) {\n // Treat as successful from the UI perspective.\n // This allows navigation to the instance page even if the workflow execution\n // fails immediately after initiation. The presence of an instance id or a successful\n // 'ok' status indicates the initiation was successful.\n return jsonResponse;\n }\n if (jsonResponse?.message) {\n errorLines.push(`Message: ${jsonResponse.message}`);\n }\n if (jsonResponse?.details) {\n errorLines.push(`Details: ${jsonResponse.details}`);\n }\n if (jsonResponse?.stack) {\n errorLines.push(`Stack Trace: ${jsonResponse.stack}`);\n }\n if (jsonResponse?.failedNodeId) {\n errorLines.push(`Failed Node ID: ${jsonResponse.failedNodeId}`);\n }\n this.logger.error(`${logErrorPrefix}: ${JSON.stringify(jsonResponse)}`);\n } catch (jsonParseError) {\n this.logger.error(\n `${logErrorPrefix}. The details of this error cannot be provided because the response body was not in a parsable format.`,\n );\n }\n throw new Error(errorLines.join('\\n'));\n }\n}\n"],"names":["Kafka","fromWorkflowSource","groupByProcessIdAndVersion","getWorkflowRunStats","randomUUID","CloudEvent","KafkaCE","capitalize","extractWorkflowFormat"],"mappings":"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"}
@@ -13,7 +13,8 @@ function mapToWorkflowOverviewDTO(overview) {
13
13
  lastRunStatus: overview.lastRunStatus ? getProcessInstancesStatusDTOFromString(overview.lastRunStatus) : void 0,
14
14
  lastTriggeredMs: overview.lastTriggeredMs,
15
15
  isAvailable: overview.isAvailable,
16
- version: overview.version
16
+ version: overview.version,
17
+ workflowRunStats: overview.workflowRunStats
17
18
  };
18
19
  }
19
20
  function getWorkflowFormatDTO(source) {
@@ -1 +1 @@
1
- {"version":3,"file":"V2Mappings.cjs.js","sources":["../../../../src/service/api/mapping/V2Mappings.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 { DateTime, Duration } from 'luxon';\n\nimport {\n capitalize,\n ExecuteWorkflowResponseDTO,\n extractWorkflowFormat,\n fromWorkflowSource,\n NodeInstance,\n NodeInstanceDTO,\n ProcessInstance,\n ProcessInstanceDTO,\n ProcessInstanceState,\n ProcessInstanceStatusDTO,\n WorkflowDTO,\n WorkflowExecutionResponse,\n WorkflowFormatDTO,\n WorkflowOverview,\n WorkflowOverviewDTO,\n WorkflowRunStatusDTO,\n type ProcessInstanceStatusDTO as ProcessInstanceStatusDTOType,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\n// Mapping functions\nexport function mapToWorkflowOverviewDTO(\n overview: WorkflowOverview,\n): WorkflowOverviewDTO {\n return {\n name: overview.name,\n format: overview.format,\n workflowId: overview.workflowId,\n description: overview.description,\n lastRunId: overview.lastRunId,\n lastRunStatus: overview.lastRunStatus\n ? getProcessInstancesStatusDTOFromString(overview.lastRunStatus)\n : undefined,\n lastTriggeredMs: overview.lastTriggeredMs,\n isAvailable: overview.isAvailable,\n version: overview.version,\n };\n}\n\nexport function getWorkflowFormatDTO(source: string): WorkflowFormatDTO {\n return extractWorkflowFormat(source);\n}\n\nexport function mapToWorkflowDTO(source: string): WorkflowDTO {\n const definition = fromWorkflowSource(source);\n return {\n annotations: definition.annotations,\n description: definition.description,\n name: definition.name,\n format: getWorkflowFormatDTO(source),\n id: definition.id,\n };\n}\n\nexport function getProcessInstancesStatusDTOFromString(\n state: string,\n): ProcessInstanceStatusDTOType {\n if (\n !Object.values(ProcessInstanceStatusDTO).includes(\n state as ProcessInstanceStatusDTOType,\n )\n ) {\n throw new Error(\n `state ${state} is not one of the values of type ProcessInstanceStatusDTO`,\n );\n }\n return state as ProcessInstanceStatusDTOType;\n}\n\nexport function mapToProcessInstanceDTO(\n processInstance: ProcessInstance,\n): ProcessInstanceDTO {\n const start = DateTime.fromISO(processInstance.start as string, {\n setZone: true,\n });\n const end = DateTime.fromISO(processInstance.end as string, {\n setZone: true,\n });\n const duration = processInstance.end\n ? Duration.fromMillis(end.diff(start).toMillis())\n .shiftTo('hours', 'minutes', 'seconds')\n .toHuman({ unitDisplay: 'long' })\n : undefined;\n\n let variables: Record<string, unknown> | undefined;\n if (typeof processInstance?.variables === 'string') {\n variables = JSON.parse(processInstance?.variables);\n } else {\n variables = processInstance?.variables;\n }\n\n return {\n id: processInstance.id,\n version: processInstance.version,\n processId: processInstance.processId,\n processName: processInstance.processName,\n description: processInstance.description,\n serviceUrl: processInstance.serviceUrl,\n executionSummary: processInstance.executionSummary,\n endpoint: processInstance.endpoint,\n error: processInstance.error,\n start: processInstance.start,\n end: processInstance.end,\n duration: duration,\n // @ts-ignore\n workflowdata: variables?.workflowdata,\n initiatorEntity: variables?.initiatorEntity as string,\n targetEntity: variables?.targetEntity as string,\n state: processInstance.state\n ? getProcessInstancesStatusDTOFromString(processInstance.state)\n : undefined,\n nodes: processInstance.nodes.map(mapToNodeInstanceDTO),\n };\n}\n\nexport function mapToNodeInstanceDTO(\n nodeInstance: NodeInstance,\n): NodeInstanceDTO {\n return { ...nodeInstance, __typename: 'NodeInstance' };\n}\n\nexport function mapToExecuteWorkflowResponseDTO(\n workflowId: string,\n workflowExecutionResponse: WorkflowExecutionResponse,\n): ExecuteWorkflowResponseDTO {\n if (!workflowExecutionResponse?.id) {\n throw new Error(\n `Error while mapping ExecuteWorkflowResponse to ExecuteWorkflowResponseDTO for workflow with id ${workflowId}`,\n );\n }\n\n return {\n id: workflowExecutionResponse.id,\n };\n}\n\nexport function mapToWorkflowRunStatusDTO(\n status: ProcessInstanceState,\n): WorkflowRunStatusDTO {\n return {\n key: capitalize(status),\n value: status,\n };\n}\n"],"names":["extractWorkflowFormat","fromWorkflowSource","ProcessInstanceStatusDTO","DateTime","Duration","capitalize"],"mappings":"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"}
1
+ {"version":3,"file":"V2Mappings.cjs.js","sources":["../../../../src/service/api/mapping/V2Mappings.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 { DateTime, Duration } from 'luxon';\n\nimport {\n capitalize,\n ExecuteWorkflowResponseDTO,\n extractWorkflowFormat,\n fromWorkflowSource,\n NodeInstance,\n NodeInstanceDTO,\n ProcessInstance,\n ProcessInstanceDTO,\n ProcessInstanceState,\n ProcessInstanceStatusDTO,\n WorkflowDTO,\n WorkflowExecutionResponse,\n WorkflowFormatDTO,\n WorkflowOverview,\n WorkflowOverviewDTO,\n WorkflowRunStatusDTO,\n type ProcessInstanceStatusDTO as ProcessInstanceStatusDTOType,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\n// Mapping functions\nexport function mapToWorkflowOverviewDTO(\n overview: WorkflowOverview,\n): WorkflowOverviewDTO {\n return {\n name: overview.name,\n format: overview.format,\n workflowId: overview.workflowId,\n description: overview.description,\n lastRunId: overview.lastRunId,\n lastRunStatus: overview.lastRunStatus\n ? getProcessInstancesStatusDTOFromString(overview.lastRunStatus)\n : undefined,\n lastTriggeredMs: overview.lastTriggeredMs,\n isAvailable: overview.isAvailable,\n version: overview.version,\n workflowRunStats: overview.workflowRunStats,\n };\n}\n\nexport function getWorkflowFormatDTO(source: string): WorkflowFormatDTO {\n return extractWorkflowFormat(source);\n}\n\nexport function mapToWorkflowDTO(source: string): WorkflowDTO {\n const definition = fromWorkflowSource(source);\n return {\n annotations: definition.annotations,\n description: definition.description,\n name: definition.name,\n format: getWorkflowFormatDTO(source),\n id: definition.id,\n };\n}\n\nexport function getProcessInstancesStatusDTOFromString(\n state: string,\n): ProcessInstanceStatusDTOType {\n if (\n !Object.values(ProcessInstanceStatusDTO).includes(\n state as ProcessInstanceStatusDTOType,\n )\n ) {\n throw new Error(\n `state ${state} is not one of the values of type ProcessInstanceStatusDTO`,\n );\n }\n return state as ProcessInstanceStatusDTOType;\n}\n\nexport function mapToProcessInstanceDTO(\n processInstance: ProcessInstance,\n): ProcessInstanceDTO {\n const start = DateTime.fromISO(processInstance.start as string, {\n setZone: true,\n });\n const end = DateTime.fromISO(processInstance.end as string, {\n setZone: true,\n });\n const duration = processInstance.end\n ? Duration.fromMillis(end.diff(start).toMillis())\n .shiftTo('hours', 'minutes', 'seconds')\n .toHuman({ unitDisplay: 'long' })\n : undefined;\n\n let variables: Record<string, unknown> | undefined;\n if (typeof processInstance?.variables === 'string') {\n variables = JSON.parse(processInstance?.variables);\n } else {\n variables = processInstance?.variables;\n }\n\n return {\n id: processInstance.id,\n version: processInstance.version,\n processId: processInstance.processId,\n processName: processInstance.processName,\n description: processInstance.description,\n serviceUrl: processInstance.serviceUrl,\n executionSummary: processInstance.executionSummary,\n endpoint: processInstance.endpoint,\n error: processInstance.error,\n start: processInstance.start,\n end: processInstance.end,\n duration: duration,\n // @ts-ignore\n workflowdata: variables?.workflowdata,\n initiatorEntity: variables?.initiatorEntity as string,\n targetEntity: variables?.targetEntity as string,\n state: processInstance.state\n ? getProcessInstancesStatusDTOFromString(processInstance.state)\n : undefined,\n nodes: processInstance.nodes.map(mapToNodeInstanceDTO),\n };\n}\n\nexport function mapToNodeInstanceDTO(\n nodeInstance: NodeInstance,\n): NodeInstanceDTO {\n return { ...nodeInstance, __typename: 'NodeInstance' };\n}\n\nexport function mapToExecuteWorkflowResponseDTO(\n workflowId: string,\n workflowExecutionResponse: WorkflowExecutionResponse,\n): ExecuteWorkflowResponseDTO {\n if (!workflowExecutionResponse?.id) {\n throw new Error(\n `Error while mapping ExecuteWorkflowResponse to ExecuteWorkflowResponseDTO for workflow with id ${workflowId}`,\n );\n }\n\n return {\n id: workflowExecutionResponse.id,\n };\n}\n\nexport function mapToWorkflowRunStatusDTO(\n status: ProcessInstanceState,\n): WorkflowRunStatusDTO {\n return {\n key: capitalize(status),\n value: status,\n };\n}\n"],"names":["extractWorkflowFormat","fromWorkflowSource","ProcessInstanceStatusDTO","DateTime","Duration","capitalize"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@red-hat-developer-hub/backstage-plugin-orchestrator-backend",
3
- "version": "8.9.5",
3
+ "version": "8.10.1",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/index.cjs.js",
6
6
  "types": "./dist/index.d.ts",
@@ -73,19 +73,19 @@
73
73
  "export-dynamic": "janus-cli package export-dynamic-plugin"
74
74
  },
75
75
  "dependencies": {
76
- "@backstage/backend-defaults": "^0.16.0",
77
- "@backstage/backend-plugin-api": "^1.8.0",
78
- "@backstage/catalog-client": "^1.14.0",
79
- "@backstage/core-plugin-api": "^1.12.4",
80
- "@backstage/errors": "^1.2.7",
81
- "@backstage/integration": "^2.0.0",
82
- "@backstage/plugin-catalog-node": "^2.1.0",
83
- "@backstage/plugin-permission-common": "^0.9.7",
84
- "@backstage/plugin-permission-node": "^0.10.11",
85
- "@backstage/plugin-scaffolder-backend": "^3.2.0",
86
- "@backstage/plugin-scaffolder-node": "^0.13.0",
87
- "@red-hat-developer-hub/backstage-plugin-orchestrator-common": "^3.6.4",
88
- "@red-hat-developer-hub/backstage-plugin-orchestrator-node": "^1.2.4",
76
+ "@backstage/backend-defaults": "^0.17.2",
77
+ "@backstage/backend-plugin-api": "^1.9.1",
78
+ "@backstage/catalog-client": "^1.15.2",
79
+ "@backstage/core-plugin-api": "^1.12.6",
80
+ "@backstage/errors": "^1.3.1",
81
+ "@backstage/integration": "^2.0.2",
82
+ "@backstage/plugin-catalog-node": "^2.2.1",
83
+ "@backstage/plugin-permission-common": "^0.9.9",
84
+ "@backstage/plugin-permission-node": "^0.11.0",
85
+ "@backstage/plugin-scaffolder-backend": "^4.0.0",
86
+ "@backstage/plugin-scaffolder-node": "^0.13.3",
87
+ "@red-hat-developer-hub/backstage-plugin-orchestrator-common": "^3.7.1",
88
+ "@red-hat-developer-hub/backstage-plugin-orchestrator-node": "^1.3.1",
89
89
  "@urql/core": "^6.0.1",
90
90
  "ajv-formats": "^2.1.1",
91
91
  "cloudevents": "^10.0.0",
@@ -102,15 +102,15 @@
102
102
  },
103
103
  "devDependencies": {
104
104
  "@backstage-community/plugin-rbac-common": "^1.12.1",
105
- "@backstage/backend-test-utils": "^1.11.1",
106
- "@backstage/cli": "^0.36.0",
105
+ "@backstage/backend-test-utils": "^1.11.3",
106
+ "@backstage/cli": "^0.36.2",
107
107
  "@janus-idp/backstage-plugin-audit-log-node": "^1.7.1",
108
108
  "@janus-idp/cli": "3.7.0",
109
109
  "@types/express": "4.17.25",
110
110
  "@types/fs-extra": "11.0.4",
111
111
  "@types/json-schema": "7.0.15",
112
112
  "@types/luxon": "^3.7.1",
113
- "prettier": "3.8.3"
113
+ "prettier": "3.8.4"
114
114
  },
115
115
  "peerDependencies": {
116
116
  "@backstage-community/plugin-rbac-common": "^1.12.1",