From cbf609760ee05b771527f4e3030fa07192e21a63 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Sun, 10 Sep 2023 16:39:42 +0200 Subject: [PATCH] Ensure BookmarksDeleting and BookmarksDeleted events are published Fixes #4389 --- .../Modules/Runtime/Stores/DapperBookmarkStore.cs | 1 + .../Services/ProtoActorWorkflowRuntime.cs | 11 ++++++----- .../Elsa.Workflows.Runtime/Filters/BookmarkFilter.cs | 6 ++++++ .../Services/DefaultWorkflowRuntime.cs | 11 ++++++----- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/modules/Elsa.Dapper/Modules/Runtime/Stores/DapperBookmarkStore.cs b/src/modules/Elsa.Dapper/Modules/Runtime/Stores/DapperBookmarkStore.cs index 00418096a..e19c325cd 100644 --- a/src/modules/Elsa.Dapper/Modules/Runtime/Stores/DapperBookmarkStore.cs +++ b/src/modules/Elsa.Dapper/Modules/Runtime/Stores/DapperBookmarkStore.cs @@ -53,6 +53,7 @@ public class DapperBookmarkStore : IBookmarkStore { query .Is(nameof(StoredBookmarkRecord.Hash), filter.Hash) + .In(nameof(StoredBookmarkRecord.Hash), filter.Hashes) .Is(nameof(StoredBookmarkRecord.WorkflowInstanceId), filter.WorkflowInstanceId) .In(nameof(StoredBookmarkRecord.WorkflowInstanceId), filter.WorkflowInstanceIds) .Is(nameof(StoredBookmarkRecord.CorrelationId), filter.CorrelationId) diff --git a/src/modules/Elsa.ProtoActor/Services/ProtoActorWorkflowRuntime.cs b/src/modules/Elsa.ProtoActor/Services/ProtoActorWorkflowRuntime.cs index 76e3e759b..6f82cc9b5 100644 --- a/src/modules/Elsa.ProtoActor/Services/ProtoActorWorkflowRuntime.cs +++ b/src/modules/Elsa.ProtoActor/Services/ProtoActorWorkflowRuntime.cs @@ -35,6 +35,7 @@ internal class ProtoActorWorkflowRuntime : IWorkflowRuntime private readonly IWorkflowInstanceStore _workflowInstanceStore; private readonly IIdentityGenerator _identityGenerator; private readonly IBookmarkHasher _hasher; + private readonly IBookmarkManager _bookmarkManager; private readonly IWorkflowDefinitionService _workflowDefinitionService; private readonly IWorkflowInstanceFactory _workflowInstanceFactory; private readonly WorkflowExecutionResultMapper _workflowExecutionResultMapper; @@ -50,6 +51,7 @@ internal class ProtoActorWorkflowRuntime : IWorkflowRuntime IWorkflowInstanceStore workflowInstanceStore, IIdentityGenerator identityGenerator, IBookmarkHasher hasher, + IBookmarkManager bookmarkManager, IWorkflowDefinitionService workflowDefinitionService, IWorkflowInstanceFactory workflowInstanceFactory, WorkflowExecutionResultMapper workflowExecutionResultMapper) @@ -61,6 +63,7 @@ internal class ProtoActorWorkflowRuntime : IWorkflowRuntime _workflowInstanceStore = workflowInstanceStore; _identityGenerator = identityGenerator; _hasher = hasher; + _bookmarkManager = bookmarkManager; _workflowDefinitionService = workflowDefinitionService; _workflowInstanceFactory = workflowInstanceFactory; _workflowExecutionResultMapper = workflowExecutionResultMapper; @@ -300,11 +303,9 @@ internal class ProtoActorWorkflowRuntime : IWorkflowRuntime private async Task RemoveBookmarksAsync(string workflowInstanceId, IEnumerable bookmarks, CancellationToken cancellationToken = default) { - foreach (var bookmark in bookmarks) - { - var filter = new BookmarkFilter { Hash = bookmark.Hash, WorkflowInstanceId = workflowInstanceId }; - await _bookmarkStore.DeleteAsync(filter, 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> FindStartableWorkflowsAsync(WorkflowsFilter workflowsFilter, CancellationToken cancellationToken) diff --git a/src/modules/Elsa.Workflows.Runtime/Filters/BookmarkFilter.cs b/src/modules/Elsa.Workflows.Runtime/Filters/BookmarkFilter.cs index 03ea24980..c848917a5 100644 --- a/src/modules/Elsa.Workflows.Runtime/Filters/BookmarkFilter.cs +++ b/src/modules/Elsa.Workflows.Runtime/Filters/BookmarkFilter.cs @@ -32,6 +32,11 @@ public class BookmarkFilter /// public string? Hash { get; set; } + /// + /// Gets or sets the hashes of the bookmarks to find. + /// + public ICollection? Hashes { get; set; } + /// /// Gets or sets the correlation ID of the bookmark to find. /// @@ -62,6 +67,7 @@ public class BookmarkFilter if (filter.BookmarkIds != null) query = query.Where(x => filter.BookmarkIds.Contains(x.BookmarkId)); if (filter.CorrelationId != null) query = query.Where(x => x.CorrelationId == filter.CorrelationId); if (filter.Hash != null) query = query.Where(x => x.Hash == filter.Hash); + if (filter.Hashes != null) query = query.Where(x => filter.Hashes.Contains(x.Hash)); if (filter.WorkflowInstanceId != null) query = query.Where(x => x.WorkflowInstanceId == filter.WorkflowInstanceId); if (filter.WorkflowInstanceIds != null) query = query.Where(x => filter.WorkflowInstanceIds.Contains(x.WorkflowInstanceId)); if (filter.ActivityTypeName != null) query = query.Where(x => x.ActivityTypeName == filter.ActivityTypeName); diff --git a/src/modules/Elsa.Workflows.Runtime/Services/DefaultWorkflowRuntime.cs b/src/modules/Elsa.Workflows.Runtime/Services/DefaultWorkflowRuntime.cs index d8d90e7dd..1031ae89f 100644 --- a/src/modules/Elsa.Workflows.Runtime/Services/DefaultWorkflowRuntime.cs +++ b/src/modules/Elsa.Workflows.Runtime/Services/DefaultWorkflowRuntime.cs @@ -27,6 +27,7 @@ public class DefaultWorkflowRuntime : IWorkflowRuntime private readonly ITriggerStore _triggerStore; private readonly IBookmarkStore _bookmarkStore; private readonly IBookmarkHasher _hasher; + private readonly IBookmarkManager _bookmarkManager; private readonly IDistributedLockProvider _distributedLockProvider; private readonly IWorkflowInstanceFactory _workflowInstanceFactory; private readonly WorkflowStateMapper _workflowStateMapper; @@ -42,6 +43,7 @@ public class DefaultWorkflowRuntime : IWorkflowRuntime ITriggerStore triggerStore, IBookmarkStore bookmarkStore, IBookmarkHasher hasher, + IBookmarkManager bookmarkManager, IDistributedLockProvider distributedLockProvider, IWorkflowInstanceFactory workflowInstanceFactory, WorkflowStateMapper workflowStateMapper, @@ -53,6 +55,7 @@ public class DefaultWorkflowRuntime : IWorkflowRuntime _triggerStore = triggerStore; _bookmarkStore = bookmarkStore; _hasher = hasher; + _bookmarkManager = bookmarkManager; _distributedLockProvider = distributedLockProvider; _workflowInstanceFactory = workflowInstanceFactory; _workflowStateMapper = workflowStateMapper; @@ -351,11 +354,9 @@ public class DefaultWorkflowRuntime : IWorkflowRuntime private async Task RemoveBookmarksAsync(string workflowInstanceId, IEnumerable bookmarks, CancellationToken cancellationToken) { - foreach (var bookmark in bookmarks) - { - var filter = new BookmarkFilter { Hash = bookmark.Hash, WorkflowInstanceId = workflowInstanceId }; - await _bookmarkStore.DeleteAsync(filter, 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> FindStartableWorkflowsAsync(