using Elsa.Workflows.Contracts;
using Elsa.Workflows.Helpers;
using Elsa.Workflows.Runtime.Filters;
using Elsa.Workflows.Runtime.Messages;
using Elsa.Workflows.Runtime.Options;
namespace Elsa.Workflows.Runtime;
///
public class BookmarkResumer(IWorkflowRuntime workflowRuntime, IBookmarkStore bookmarkStore, IStimulusHasher stimulusHasher) : IBookmarkResumer
{
///
public Task ResumeAsync(object stimulus, ResumeBookmarkOptions? options, CancellationToken cancellationToken = default) where TActivity : IActivity
{
return ResumeAsync(stimulus, null, options, cancellationToken);
}
///
public async Task ResumeAsync(object stimulus, string? workflowInstanceId, ResumeBookmarkOptions? options, CancellationToken cancellationToken = default) where TActivity : IActivity
{
var activityTypeName = ActivityTypeNameHelper.GenerateTypeName();
var stimulusHash = stimulusHasher.Hash(activityTypeName, stimulus);
var bookmarkFilter = new BookmarkFilter
{
ActivityTypeName = activityTypeName,
WorkflowInstanceId = workflowInstanceId,
Hash = stimulusHash,
};
return await ResumeAsync(bookmarkFilter, options, cancellationToken);
}
///
public async Task ResumeAsync(BookmarkFilter filter, ResumeBookmarkOptions? options = null, CancellationToken cancellationToken = default)
{
var bookmark = await bookmarkStore.FindAsync(filter, cancellationToken);
if (bookmark == null)
return ResumeBookmarkResult.NotFound();
var workflowClient = await workflowRuntime.CreateClientAsync(bookmark.WorkflowInstanceId, cancellationToken);
var runRequest = new RunWorkflowInstanceRequest
{
Input = options?.Input,
Properties = options?.Properties,
BookmarkId = bookmark.Id
};
var response = await workflowClient.RunInstanceAsync(runRequest, cancellationToken);
return ResumeBookmarkResult.Found(response);
}
}