using Elsa.Workflows.Management;
using Elsa.Workflows.Management.Filters;
using Elsa.Workflows.Models;
using Elsa.Workflows.Runtime;
using Elsa.Workflows.Runtime.Entities;
using Elsa.Workflows.Runtime.Filters;
using Open.Linq.AsyncExtensions;
namespace Elsa.Http.Services;
///
public class HttpWorkflowLookupService(ITriggerStore triggerStore, IWorkflowDefinitionService workflowDefinitionService) : IHttpWorkflowLookupService
{
///
public async Task FindWorkflowAsync(string bookmarkHash, CancellationToken cancellationToken = default)
{
var triggers = await FindTriggersAsync(bookmarkHash, cancellationToken).ToList();
if (triggers.Count > 1)
return new(null, triggers);
var trigger = triggers.SingleOrDefault();
if (trigger == null)
return default;
var workflowGraph = await FindWorkflowGraphAsync(trigger, cancellationToken);
if (workflowGraph == null)
return default;
return new(workflowGraph, triggers);
}
private async Task> FindTriggersAsync(string bookmarkHash, CancellationToken cancellationToken)
{
var triggerFilter = new TriggerFilter
{
Hash = bookmarkHash
};
return await triggerStore.FindManyAsync(triggerFilter, cancellationToken);
}
private async Task FindWorkflowGraphAsync(StoredTrigger trigger, CancellationToken cancellationToken)
{
var workflowDefinitionVersionId = trigger.WorkflowDefinitionVersionId;
var filter = new WorkflowDefinitionFilter
{
Id = workflowDefinitionVersionId
};
return await workflowDefinitionService.FindWorkflowGraphAsync(filter, cancellationToken);
}
}