From c8a9a2ef8fe8363096541025a3cf97ed1a42153b Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Thu, 11 Aug 2022 20:17:50 +0200 Subject: [PATCH] Simplify activity definition activity --- .../EFCoreActivityDefinitionStore.cs | 3 + .../Activities/ActivityDefinitionActivity.cs | 10 --- .../UpdateReferencedVersionHandler.cs | 73 ------------------- .../ActivityDefinitionActivityProvider.cs | 7 -- .../ActivityDefinitionMaterializer.cs | 2 +- .../MemoryActivityDefinitionStore.cs | 8 +- .../Services/IActivityDefinitionStore.cs | 2 +- 7 files changed, 9 insertions(+), 96 deletions(-) delete mode 100644 src/modules/Elsa.ActivityDefinitions/Handlers/UpdateReferencedVersionHandler.cs diff --git a/src/modules/Elsa.ActivityDefinitions.EntityFrameworkCore/Implementations/EFCoreActivityDefinitionStore.cs b/src/modules/Elsa.ActivityDefinitions.EntityFrameworkCore/Implementations/EFCoreActivityDefinitionStore.cs index 6acd4a346..7dd7f3c25 100644 --- a/src/modules/Elsa.ActivityDefinitions.EntityFrameworkCore/Implementations/EFCoreActivityDefinitionStore.cs +++ b/src/modules/Elsa.ActivityDefinitions.EntityFrameworkCore/Implementations/EFCoreActivityDefinitionStore.cs @@ -49,6 +49,9 @@ public class EFCoreActivityDefinitionStore : IActivityDefinitionStore return await query.PaginateAsync(x => ActivityDefinitionSummary.FromDefinition(x), pageArgs); } + public async Task FindByTypeAsync(string type, int version, CancellationToken cancellationToken = default) => + await _store.FindAsync(x => x.Type == type && x.Version == version, cancellationToken); + public async Task FindByDefinitionIdAsync(string definitionId, VersionOptions versionOptions, CancellationToken cancellationToken = default) { Expression> predicate = x => x.DefinitionId == definitionId; diff --git a/src/modules/Elsa.ActivityDefinitions/Activities/ActivityDefinitionActivity.cs b/src/modules/Elsa.ActivityDefinitions/Activities/ActivityDefinitionActivity.cs index fe586cbfe..b723160c3 100644 --- a/src/modules/Elsa.ActivityDefinitions/Activities/ActivityDefinitionActivity.cs +++ b/src/modules/Elsa.ActivityDefinitions/Activities/ActivityDefinitionActivity.cs @@ -10,16 +10,6 @@ namespace Elsa.ActivityDefinitions.Activities; /// public class ActivityDefinitionActivity : ActivityBase { - /// - /// The activity definition ID to load & execute. - /// - public string DefinitionId { get; set; } = default!; - - /// - /// The activity definition version number to load & execute. - /// - public int DefinitionVersion { get; set; } - protected override async ValueTask ExecuteAsync(ActivityExecutionContext context) { // Construct the root activity stored in the activity definitions. diff --git a/src/modules/Elsa.ActivityDefinitions/Handlers/UpdateReferencedVersionHandler.cs b/src/modules/Elsa.ActivityDefinitions/Handlers/UpdateReferencedVersionHandler.cs deleted file mode 100644 index bb920b95e..000000000 --- a/src/modules/Elsa.ActivityDefinitions/Handlers/UpdateReferencedVersionHandler.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System.Text.Json; -using Elsa.ActivityDefinitions.Activities; -using Elsa.ActivityDefinitions.Extensions; -using Elsa.ActivityDefinitions.Services; -using Elsa.Mediator.Services; -using Elsa.Persistence.Common.Models; -using Elsa.Workflows.Core; -using Elsa.Workflows.Core.Serialization; -using Elsa.Workflows.Core.Services; -using Elsa.Workflows.Management.Notifications; -using Elsa.Workflows.Runtime.Services; -using Microsoft.Extensions.Logging; -using Open.Linq.AsyncExtensions; - -namespace Elsa.ActivityDefinitions.Handlers; - -/// -/// Updates the referenced definition version for all activity definitions referenced by the published workflow definition. -/// -public class UpdateReferencedVersionHandler : INotificationHandler -{ - private readonly IWorkflowDefinitionService _workflowDefinitionService; - private readonly IActivityWalker _activityWalker; - private readonly IActivityDefinitionStore _activityDefinitionStore; - private readonly SerializerOptionsProvider _serializerOptionsProvider; - private readonly ILogger _logger; - - public UpdateReferencedVersionHandler( - IWorkflowDefinitionService workflowDefinitionService, - IActivityWalker activityWalker, - IActivityDefinitionStore activityDefinitionStore, - SerializerOptionsProvider serializerOptionsProvider, - ILogger logger) - { - _workflowDefinitionService = workflowDefinitionService; - _activityWalker = activityWalker; - _activityDefinitionStore = activityDefinitionStore; - _serializerOptionsProvider = serializerOptionsProvider; - _logger = logger; - } - - public async Task HandleAsync(WorkflowDefinitionPublishing notification, CancellationToken cancellationToken) - { - var workflowDefinition = notification.WorkflowDefinition; - var workflow = await _workflowDefinitionService.MaterializeWorkflowAsync(workflowDefinition, cancellationToken); - var root = workflow.Root; - var graph = await _activityWalker.WalkAsync(root, cancellationToken); - var nodes = graph.Flatten().Distinct().ToList(); - var activityDefinitionLookup = await _activityDefinitionStore.ListAsync(VersionOptions.Published, cancellationToken).ToDictionary(x => x.DefinitionId); - var customActivities = nodes.Where(x => x.Activity is ActivityDefinitionActivity).Select(x => (ActivityDefinitionActivity)x.Activity).ToList(); - - foreach (var customActivity in customActivities) - { - if(!activityDefinitionLookup.TryGetValue(customActivity.DefinitionId, out var activityDefinition)) - { - _logger.LogWarning( - "Workflow definition {WorkflowDefinitionId} version {WorkflowDefinitionVersion} references a custom activity with ID {ActivityDefinitionId}, but there is no (published) activity definition by that ID", - workflowDefinition.DefinitionId, - workflowDefinition.Version, - customActivity.DefinitionId); - - continue; - } - - // Update to latest published version. - customActivity.DefinitionVersion = activityDefinition.Version; - } - - // Serialize the workflow and save changes. - var serializerOptions = _serializerOptionsProvider.CreateApiOptions(); - workflowDefinition.StringData = JsonSerializer.Serialize(root, serializerOptions); - } -} \ No newline at end of file diff --git a/src/modules/Elsa.ActivityDefinitions/Implementations/ActivityDefinitionActivityProvider.cs b/src/modules/Elsa.ActivityDefinitions/Implementations/ActivityDefinitionActivityProvider.cs index 36b0fb1c0..e136abc49 100644 --- a/src/modules/Elsa.ActivityDefinitions/Implementations/ActivityDefinitionActivityProvider.cs +++ b/src/modules/Elsa.ActivityDefinitions/Implementations/ActivityDefinitionActivityProvider.cs @@ -49,13 +49,6 @@ public class ActivityDefinitionActivityProvider : IActivityProvider var activity = (ActivityDefinitionActivity)_activityFactory.Create(typeof(ActivityDefinitionActivity), context); activity.Type = definition.Type; activity.Version = definition.Version; - - if (string.IsNullOrWhiteSpace(activity.DefinitionId)) - activity.DefinitionId = definition.DefinitionId; - - if (activity.DefinitionVersion == 0) - activity.DefinitionVersion = definition.Version; - return activity; } }; diff --git a/src/modules/Elsa.ActivityDefinitions/Implementations/ActivityDefinitionMaterializer.cs b/src/modules/Elsa.ActivityDefinitions/Implementations/ActivityDefinitionMaterializer.cs index 9bc0ab38c..73a492bdf 100644 --- a/src/modules/Elsa.ActivityDefinitions/Implementations/ActivityDefinitionMaterializer.cs +++ b/src/modules/Elsa.ActivityDefinitions/Implementations/ActivityDefinitionMaterializer.cs @@ -25,7 +25,7 @@ public class ActivityDefinitionMaterializer : IActivityDefinitionMaterializer public async Task MaterializeAsync(ActivityDefinitionActivity activity, CancellationToken cancellationToken = default) { - var definition = await _store.FindByDefinitionIdAsync(activity.DefinitionId, VersionOptions.SpecificVersion(activity.DefinitionVersion), cancellationToken); + var definition = await _store.FindByTypeAsync(activity.Type, activity.Version, cancellationToken); if (definition == null) return new Sequence(); diff --git a/src/modules/Elsa.ActivityDefinitions/Implementations/MemoryActivityDefinitionStore.cs b/src/modules/Elsa.ActivityDefinitions/Implementations/MemoryActivityDefinitionStore.cs index dbe427470..4fb9a9e14 100644 --- a/src/modules/Elsa.ActivityDefinitions/Implementations/MemoryActivityDefinitionStore.cs +++ b/src/modules/Elsa.ActivityDefinitions/Implementations/MemoryActivityDefinitionStore.cs @@ -32,15 +32,15 @@ public class MemoryActivityDefinitionStore : IActivityDefinitionStore return Task.FromResult(page); } - public Task FindByDefinitionIdAsync(string definitionId, VersionOptions versionOptions, CancellationToken cancellationToken = default) + public Task FindByTypeAsync(string type, int version, CancellationToken cancellationToken = default) { - var definition = _store.Find(x => x.DefinitionId == definitionId && x.WithVersion(versionOptions)); + var definition = _store.Find(x => x.Type == type && x.Version == version); return Task.FromResult(definition); } - public Task FindByDefinitionVersionIdAsync(string definitionVersionId, CancellationToken cancellationToken = default) + public Task FindByDefinitionIdAsync(string definitionId, VersionOptions versionOptions, CancellationToken cancellationToken = default) { - var definition = _store.Find(x => x.Id == definitionVersionId); + var definition = _store.Find(x => x.DefinitionId == definitionId && x.WithVersion(versionOptions)); return Task.FromResult(definition); } diff --git a/src/modules/Elsa.ActivityDefinitions/Services/IActivityDefinitionStore.cs b/src/modules/Elsa.ActivityDefinitions/Services/IActivityDefinitionStore.cs index 0ac8f0178..fb309d2fb 100644 --- a/src/modules/Elsa.ActivityDefinitions/Services/IActivityDefinitionStore.cs +++ b/src/modules/Elsa.ActivityDefinitions/Services/IActivityDefinitionStore.cs @@ -16,8 +16,8 @@ public interface IActivityDefinitionStore PageArgs? pageArgs = default, CancellationToken cancellationToken = default); + Task FindByTypeAsync(string type, int version, CancellationToken cancellationToken = default); Task FindByDefinitionIdAsync(string definitionId, VersionOptions versionOptions, CancellationToken cancellationToken = default); - Task FindByDefinitionVersionIdAsync(string definitionVersionId, CancellationToken cancellationToken = default); Task> FindLatestAndPublishedByDefinitionIdAsync(string definitionId, CancellationToken cancellationToken = default); Task SaveAsync(ActivityDefinition record, CancellationToken cancellationToken = default); Task DeleteByDefinitionIdAsync(string definitionId, CancellationToken cancellationToken = default);