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); } }