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