public async Task <RunWorkflowResult?> FindAndRestartTestWorkflowAsync( string workflowDefinitionId, string activityId, int version, string signalRConnectionId, string lastWorkflowInstanceId, string?tenantId = default, CancellationToken cancellationToken = default) { var workflowBlueprint = await _workflowRegistry.FindAsync(workflowDefinitionId, VersionOptions.SpecificVersion(version), tenantId, cancellationToken); if (workflowBlueprint == null) { return(null); } var lastWorkflowInstance = await _workflowInstanceStore.FindAsync(new EntityIdSpecification <WorkflowInstance>(lastWorkflowInstanceId), cancellationToken); if (lastWorkflowInstance == null) { return(null); } var startActivity = workflowBlueprint.Activities.First(x => x.Id == activityId); var startableWorkflowDefinition = new StartableWorkflowDefinition(workflowBlueprint, startActivity.Id); var workflow = await InstantiateStartableWorkflow(startableWorkflowDefinition, cancellationToken); var previousActivityData = GetActivityDataFromLastWorkflowInstance(lastWorkflowInstance, workflowBlueprint, activityId); MergeActivityDataIntoInstance(workflow.WorkflowInstance, previousActivityData); SetMetadata(workflow.WorkflowInstance, signalRConnectionId); //if previousActivityOutput has any items, then the first one is from activity closest to the starting one var previousActivityOutput = previousActivityData.Count == 0 ? null : previousActivityData.First().Value?.GetItem("Output"); return(await ExecuteStartableWorkflowAsync(workflow, new WorkflowInput(previousActivityOutput), cancellationToken)); }
private async Task <bool> GetWorkflowIsAlreadyExecutingAsync(string?tenantId, string workflowDefinitionId) { var specification = new TenantSpecification <WorkflowInstance>(tenantId).WithWorkflowDefinition(workflowDefinitionId).And(new WorkflowIsAlreadyExecutingSpecification()); return(await _workflowInstanceStore.FindAsync(specification) != null); }
public static Task <WorkflowInstance?> FindByCorrelationIdAsync( this IWorkflowInstanceStore store, string correlationId, Func <ISpecification <WorkflowInstance>, ISpecification <WorkflowInstance> > specificationBuilder, CancellationToken cancellationToken = default) => store.FindAsync(specificationBuilder(new CorrelationIdSpecification <WorkflowInstance>(correlationId)), cancellationToken);
public Task <WorkflowInstance?> FindAsync(ISpecification <WorkflowInstance> specification, CancellationToken cancellationToken = default) => _store.FindAsync(specification, cancellationToken);
public static Task <WorkflowInstance?> FindByIdAsync( this IWorkflowInstanceStore store, string id, CancellationToken cancellationToken = default) => store.FindAsync(new WorkflowInstanceIdSpecification(id), cancellationToken);