using Elsa.Workflows.Models; using Elsa.Workflows.Runtime.Contracts; using Elsa.Workflows.Runtime.Entities; using Elsa.Workflows.Runtime.Filters; using Elsa.Workflows.Runtime.Requests; namespace Elsa.Workflows.Runtime.Services; /// public class BookmarkUpdater(IBookmarkManager bookmarkManager, IBookmarkStore bookmarkStore) : IBookmarkUpdater { /// public async Task UpdateBookmarksAsync(UpdateBookmarksRequest request, CancellationToken cancellationToken = default) { var instanceId = request.WorkflowInstanceId; await RemoveBookmarksAsync(instanceId, request.Diff.Removed, cancellationToken); await StoreBookmarksAsync(instanceId, request.Diff.Added, request.CorrelationId, cancellationToken); } private async Task RemoveBookmarksAsync(string workflowInstanceId, IEnumerable bookmarks, CancellationToken cancellationToken) { var matchingHashes = bookmarks.Select(x => x.Hash).ToList(); var filter = new BookmarkFilter { Hashes = matchingHashes, WorkflowInstanceId = workflowInstanceId }; await bookmarkManager.DeleteManyAsync(filter, cancellationToken); } private async Task StoreBookmarksAsync(string workflowInstanceId, IEnumerable bookmarks, string? correlationId, CancellationToken cancellationToken) { foreach (var bookmark in bookmarks) { var storedBookmark = new StoredBookmark(bookmark.Id, bookmark.Name, bookmark.Hash, workflowInstanceId, bookmark.CreatedAt, bookmark.ActivityInstanceId, correlationId, bookmark.Payload, bookmark.Metadata); await bookmarkStore.SaveAsync(storedBookmark, cancellationToken); } } }