using Elsa.Workflows.Helpers; using Elsa.Workflows.Runtime.Exceptions; using Elsa.Workflows.Runtime.Filters; using Elsa.Workflows.Runtime.Messages; using Elsa.Workflows.Runtime.Options; using Microsoft.Extensions.Logging; namespace Elsa.Workflows.Runtime; /// [Obsolete("Use WorkflowResumer instead.")] public class BookmarkResumer(IWorkflowRuntime workflowRuntime, IBookmarkStore bookmarkStore, IStimulusHasher stimulusHasher, ILogger logger) : IBookmarkResumer { /// public Task ResumeAsync(object stimulus, ResumeBookmarkOptions? options = null, CancellationToken cancellationToken = default) where TActivity : IActivity { return ResumeAsync(stimulus, null, options, cancellationToken); } /// public async Task ResumeAsync(object stimulus, string? workflowInstanceId = null, ResumeBookmarkOptions? options = null, CancellationToken cancellationToken = default) where TActivity : IActivity { var activityTypeName = ActivityTypeNameHelper.GenerateTypeName(); var stimulusHash = stimulusHasher.Hash(activityTypeName, stimulus); var bookmarkFilter = new BookmarkFilter { Name = activityTypeName, WorkflowInstanceId = workflowInstanceId, Hash = stimulusHash, }; return await ResumeAsync(bookmarkFilter, options, cancellationToken); } /// public async Task ResumeAsync(string bookmarkId, IDictionary input, CancellationToken cancellationToken = default) { var bookmarkFilter = new BookmarkFilter { BookmarkId = bookmarkId }; var options = new ResumeBookmarkOptions { Input = input }; return await ResumeAsync(bookmarkFilter, options, cancellationToken); } /// public async Task ResumeAsync(string bookmarkId, ResumeBookmarkOptions? options = null, CancellationToken cancellationToken = default) where TActivity : IActivity { var activityTypeName = ActivityTypeNameHelper.GenerateTypeName(); var bookmarkFilter = new BookmarkFilter { Name = activityTypeName, BookmarkId = bookmarkId }; return await ResumeAsync(bookmarkFilter, options, cancellationToken); } public async Task ResumeAsync(ResumeBookmarkRequest request, CancellationToken cancellationToken = default) { var runRequest = new RunWorkflowInstanceRequest { Input = request.Input, Properties = request.Properties, ActivityHandle = request.ActivityHandle, BookmarkId = request.BookmarkId }; var workflowInstanceId = request.WorkflowInstanceId; var workflowClient = await workflowRuntime.CreateClientAsync(workflowInstanceId, cancellationToken); var response = await workflowClient.RunInstanceAsync(runRequest, cancellationToken); return ResumeBookmarkResult.Found(response); } /// public async Task ResumeAsync(BookmarkFilter filter, ResumeBookmarkOptions? options = null, CancellationToken cancellationToken = default) { var bookmark = await bookmarkStore.FindAsync(filter, cancellationToken); if (bookmark == null) { logger.LogDebug("Bookmark not found in store for filter {@Filter}", filter); return ResumeBookmarkResult.NotFound(); } var workflowClient = await workflowRuntime.CreateClientAsync(bookmark.WorkflowInstanceId, cancellationToken); var runRequest = new RunWorkflowInstanceRequest { Input = options?.Input, Properties = options?.Properties, BookmarkId = bookmark.Id }; try { var response = await workflowClient.RunInstanceAsync(runRequest, cancellationToken); logger.LogDebug("Resumed workflow instance {WorkflowInstanceId} with bookmark {BookmarkId}", bookmark.WorkflowInstanceId, bookmark.Id); return ResumeBookmarkResult.Found(response); } catch (WorkflowInstanceNotFoundException) { // The workflow instance does not (yet) exist in the DB. logger.LogDebug("No workflow instance with ID {WorkflowInstanceId} found for bookmark {BookmarkId} at this time.", bookmark.WorkflowInstanceId, bookmark.Id); return ResumeBookmarkResult.NotFound(); } } }