public async Task <IRequestHandlerResult> HandleRequestAsync() { // TODO: Optimize this by building up a hash of routes and workflows to execute. var requestPath = new Uri(httpContext.Request.Path.ToString(), UriKind.Relative); var method = httpContext.Request.Method; var httpWorkflows = await registry.ListByStartActivityAsync(nameof(ReceiveHttpRequest), cancellationToken); var workflowsToStart = Filter(httpWorkflows, requestPath, method).ToList(); var haltedHttpWorkflows = await workflowInstanceStore.ListByBlockingActivityAsync <ReceiveHttpRequest>( cancellationToken : cancellationToken); var workflowsToResume = Filter(haltedHttpWorkflows, requestPath, method).ToList(); if (!workflowsToStart.Any() && !workflowsToResume.Any()) { return(new NextResult()); } await InvokeWorkflowsToStartAsync(workflowsToStart); await InvokeWorkflowsToResumeAsync(workflowsToResume); return(!httpContext.Items.ContainsKey(WorkflowHttpResult.Instance) ? (IRequestHandlerResult) new AcceptedResult() : new EmptyResult()); }
private async Task <IEnumerable <WorkflowExecutionContext> > ResumeManyAsync( string activityType, Variables input = default, string correlationId = default, Func <JObject, bool> activityStatePredicate = default, CancellationToken cancellationToken = default) { var workflowInstances = await workflowInstanceStore .ListByBlockingActivityAsync(activityType, correlationId, cancellationToken) .ToListAsync(); if (activityStatePredicate != null) { workflowInstances = workflowInstances.Where(x => activityStatePredicate(x.Item2.State)).ToList(); } return(await ResumeManyAsync( workflowInstances, input, cancellationToken )); }