using Elsa.Workflows.Models; using Elsa.Workflows.Runtime.Filters; using Elsa.Workflows.Runtime.Requests; namespace Elsa.Workflows.Runtime; /// public class BookmarkUpdater(IBookmarkManager bookmarkManager, IBookmarkStore bookmarkStore) : IBookmarkUpdater { /// public async Task UpdateBookmarksAsync(UpdateBookmarksRequest request, CancellationToken cancellationToken = default) { var instanceId = request.WorkflowExecutionContext.Id; await RemoveBookmarksAsync(instanceId, request.Diff.Removed.ToList(), cancellationToken); await StoreBookmarksAsync(request.WorkflowExecutionContext, request.Diff.Added.ToList(), cancellationToken); } private async Task RemoveBookmarksAsync(string workflowInstanceId, ICollection bookmarks, CancellationToken cancellationToken) { if (bookmarks.Count == 0) return; var matchingIds = bookmarks.Select(x => x.Id).ToList(); var filter = new BookmarkFilter { BookmarkIds = matchingIds, WorkflowInstanceId = workflowInstanceId }; await bookmarkManager.DeleteManyAsync(filter, cancellationToken); } private async Task StoreBookmarksAsync(WorkflowExecutionContext context, ICollection bookmarks, CancellationToken cancellationToken) { if (bookmarks.Count == 0) return; foreach (var bookmark in bookmarks) { var storedBookmark = context.MapBookmark(bookmark); await bookmarkStore.SaveAsync(storedBookmark, cancellationToken); } } }