import Step from '../models/step.js'; import Flow from '../models/flow.js'; import Execution from '../models/execution.js'; import ExecutionStep from '../models/execution-step.js'; import computeParameters from '../helpers/compute-parameters.js'; import globalVariable from '../helpers/global-variable.js'; import { logger } from '../helpers/logger.js'; import HttpError from '../errors/http.js'; import EarlyExitError from '../errors/early-exit.js'; import AlreadyProcessedError from '../errors/already-processed.js'; export const processAction = async (options) => { const { flowId, stepId, executionId } = options; const flow = await Flow.query().findById(flowId).throwIfNotFound(); const execution = await Execution.query() .findById(executionId) .throwIfNotFound(); const step = await Step.query().findById(stepId).throwIfNotFound(); const $ = await globalVariable({ flow, app: await step.getApp(), step: step, connection: await step.$relatedQuery('connection'), execution, }); const priorExecutionSteps = await ExecutionStep.query().where({ execution_id: $.execution.id, }); const computedParameters = computeParameters( $.step.parameters, priorExecutionSteps ); const actionCommand = await step.getActionCommand(); $.step.parameters = computedParameters; try { await actionCommand.run($); } catch (error) { const shouldEarlyExit = error instanceof EarlyExitError; const shouldNotProcess = error instanceof AlreadyProcessedError; const shouldNotConsiderAsError = shouldEarlyExit || shouldNotProcess; if (!shouldNotConsiderAsError) { logger.error(error); if (error instanceof HttpError) { $.actionOutput.error = error.details; } else { try { $.actionOutput.error = JSON.parse(error.message); } catch { $.actionOutput.error = { error: error.message }; } } } } const executionStep = await execution .$relatedQuery('executionSteps') .insertAndFetch({ stepId: $.step.id, status: $.actionOutput.error ? 'failure' : 'success', dataIn: computedParameters, dataOut: $.actionOutput.error ? null : $.actionOutput.data?.raw, errorDetails: $.actionOutput.error ? $.actionOutput.error : null, }); return { flowId, stepId, executionId, executionStep, computedParameters }; };