diff --git a/src/modules/Elsa.MassTransit/Consumers/WorkflowDefinitionEventsConsumer.cs b/src/modules/Elsa.MassTransit/Consumers/WorkflowDefinitionEventsConsumer.cs index 81f921e0b..21ce26946 100644 --- a/src/modules/Elsa.MassTransit/Consumers/WorkflowDefinitionEventsConsumer.cs +++ b/src/modules/Elsa.MassTransit/Consumers/WorkflowDefinitionEventsConsumer.cs @@ -1,6 +1,6 @@ using Elsa.MassTransit.Messages; +using Elsa.Workflows.Contracts; using Elsa.Workflows.Management.Activities.WorkflowDefinitionActivity; -using Elsa.Workflows.Management.Contracts; using JetBrains.Annotations; using MassTransit; @@ -10,7 +10,7 @@ namespace Elsa.MassTransit.Consumers; /// Consumes messages related to workflow definition changes. /// [PublicAPI] -public class WorkflowDefinitionEventsConsumer(IActivityRegistryPopulator activityRegistryPopulator) : +public class WorkflowDefinitionEventsConsumer(IActivityRegistryUpdateService activityRegistryUpdateService) : IConsumer, IConsumer, IConsumer, @@ -29,7 +29,7 @@ public class WorkflowDefinitionEventsConsumer(IActivityRegistryPopulator activit /// public Task Consume(ConsumeContext context) { - activityRegistryPopulator.RemoveDefinitionFromRegistry(typeof(WorkflowDefinitionActivityProvider), context.Message.Id); + activityRegistryUpdateService.RemoveDefinitionFromRegistry(typeof(WorkflowDefinitionActivityProvider), context.Message.Id); return Task.CompletedTask; } @@ -42,7 +42,7 @@ public class WorkflowDefinitionEventsConsumer(IActivityRegistryPopulator activit /// public Task Consume(ConsumeContext context) { - activityRegistryPopulator.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), context.Message.Id); + activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), context.Message.Id); return Task.CompletedTask; } @@ -51,7 +51,7 @@ public class WorkflowDefinitionEventsConsumer(IActivityRegistryPopulator activit { foreach (var id in context.Message.Ids) { - activityRegistryPopulator.RemoveDefinitionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id); + activityRegistryUpdateService.RemoveDefinitionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id); } return Task.CompletedTask; @@ -60,7 +60,7 @@ public class WorkflowDefinitionEventsConsumer(IActivityRegistryPopulator activit /// public Task Consume(ConsumeContext context) { - activityRegistryPopulator.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), context.Message.Id); + activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), context.Message.Id); return Task.CompletedTask; } @@ -69,7 +69,7 @@ public class WorkflowDefinitionEventsConsumer(IActivityRegistryPopulator activit { foreach (var id in context.Message.Ids) { - activityRegistryPopulator.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id); + activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id); } return Task.CompletedTask; @@ -87,9 +87,9 @@ public class WorkflowDefinitionEventsConsumer(IActivityRegistryPopulator activit private Task UpdateDefinition(string id, bool usableAsActivity) { if (usableAsActivity) - return activityRegistryPopulator.AddToRegistry(typeof(WorkflowDefinitionActivityProvider), id); + return activityRegistryUpdateService.AddToRegistry(typeof(WorkflowDefinitionActivityProvider), id); - activityRegistryPopulator.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id); + activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id); return Task.CompletedTask; } } \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Contracts/IActivityRegistryUpdateService.cs b/src/modules/Elsa.Workflows.Core/Contracts/IActivityRegistryUpdateService.cs new file mode 100644 index 000000000..918be6565 --- /dev/null +++ b/src/modules/Elsa.Workflows.Core/Contracts/IActivityRegistryUpdateService.cs @@ -0,0 +1,32 @@ +namespace Elsa.Workflows.Contracts; + +/// +/// Represents a service for updating the activity registry. +/// +public interface IActivityRegistryUpdateService +{ + /// + /// Tries to add a workflow as an activity to the registry. + /// + /// The type of the activity provider. + /// The ID of the workflow definition. + /// The cancellation token. + Task AddToRegistry(Type providerType, string workflowDefinitionId, CancellationToken cancellationToken = default); + + /// + /// Removes workflow definition activities from the . + /// + /// The type of the Activity Provider. + /// The ID of the workflow definition to remove. + /// The cancellation token. + void RemoveDefinitionFromRegistry(Type providerType, string workflowDefinitionId, CancellationToken cancellationToken = default); + + + /// + /// Removes a workflow definition version activity from the . + /// + /// The type of the Activity Provider. + /// The ID of the workflow definition to remove. + /// The cancellation token. + void RemoveDefinitionVersionFromRegistry(Type providerType, string workflowDefinitionVersionId, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Features/WorkflowsFeature.cs b/src/modules/Elsa.Workflows.Core/Features/WorkflowsFeature.cs index 2b8f36931..355b0e0df 100644 --- a/src/modules/Elsa.Workflows.Core/Features/WorkflowsFeature.cs +++ b/src/modules/Elsa.Workflows.Core/Features/WorkflowsFeature.cs @@ -137,6 +137,7 @@ public class WorkflowsFeature : FeatureBase .AddSingleton() .AddSingleton() .AddScoped() + .AddScoped() .AddSingleton() .AddSingleton() .AddSingleton() diff --git a/src/modules/Elsa.Workflows.Core/Services/ActivityRegistryUpdateService.cs b/src/modules/Elsa.Workflows.Core/Services/ActivityRegistryUpdateService.cs new file mode 100644 index 000000000..b3bbb6cf8 --- /dev/null +++ b/src/modules/Elsa.Workflows.Core/Services/ActivityRegistryUpdateService.cs @@ -0,0 +1,54 @@ +using Elsa.Workflows.Contracts; +using Elsa.Workflows.Models; + +namespace Elsa.Workflows.Services; + +/// +/// Service responsible for updating the activity registry based on activity providers. +/// +public class ActivityRegistryUpdateService(IEnumerable providers, IActivityRegistry registry) : IActivityRegistryUpdateService +{ + /// + public async Task AddToRegistry(Type providerType, string workflowDefinitionVersionId, CancellationToken cancellationToken = default) + { + var provider = providers.First(x => x.GetType() == providerType); + var descriptors = await provider.GetDescriptorsAsync(cancellationToken); + var descriptorToAdd = descriptors + .SingleOrDefault(d => + d.CustomProperties.TryGetValue("WorkflowDefinitionVersionId", out var val) && + val.ToString() == workflowDefinitionVersionId); + + if (descriptorToAdd is not null) + registry.Add(providerType, descriptorToAdd); + } + + /// + public void RemoveDefinitionFromRegistry(Type providerType, string workflowDefinitionId, CancellationToken cancellationToken = default) + { + var providerDescriptors = registry.ListByProvider(providerType); + + var descriptorsToRemove = providerDescriptors + .Where(d => + d.CustomProperties.TryGetValue("WorkflowDefinitionId", out var val) && + val.ToString() == workflowDefinitionId).ToList(); + + foreach (ActivityDescriptor activityDescriptor in descriptorsToRemove) + { + registry.Remove(providerType, activityDescriptor); + } + } + + /// + public void RemoveDefinitionVersionFromRegistry(Type providerType, string workflowDefinitionVersionId, CancellationToken cancellationToken = default) + { + var providerDescriptors = registry.ListByProvider(providerType); + + var descriptorToRemove = providerDescriptors + .SingleOrDefault(d => + d.CustomProperties.TryGetValue("WorkflowDefinitionVersionId", out var val) && + val.ToString() == workflowDefinitionVersionId); + + if (descriptorToRemove is not null) + registry.Remove(providerType, descriptorToRemove); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Management/Contracts/IActivityRegistryPopulator.cs b/src/modules/Elsa.Workflows.Management/Contracts/IActivityRegistryPopulator.cs index be6c91320..f205a0411 100644 --- a/src/modules/Elsa.Workflows.Management/Contracts/IActivityRegistryPopulator.cs +++ b/src/modules/Elsa.Workflows.Management/Contracts/IActivityRegistryPopulator.cs @@ -12,29 +12,4 @@ public interface IActivityRegistryPopulator /// /// The cancellation token. Task PopulateRegistryAsync(CancellationToken cancellationToken = default); - - /// - /// Tries to add a workflow as an activity to the registry. - /// - /// The type of the activity provider. - /// The ID of the workflow definition. - /// The cancellation token. - Task AddToRegistry(Type providerType, string workflowDefinitionId, CancellationToken cancellationToken = default); - - /// - /// Removes workflow definition activities from the . - /// - /// The type of the Activity Provider. - /// The ID of the workflow definition to remove. - /// The cancellation token. - void RemoveDefinitionFromRegistry(Type providerType, string workflowDefinitionId, CancellationToken cancellationToken = default); - - - /// - /// Removes a workflow definition version activity from the . - /// - /// The type of the Activity Provider. - /// The ID of the workflow definition to remove. - /// The cancellation token. - void RemoveDefinitionVersionFromRegistry(Type providerType, string workflowDefinitionVersionId, CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Management/Handlers/RefreshActivityRegistry.cs b/src/modules/Elsa.Workflows.Management/Handlers/RefreshActivityRegistry.cs index 1fbc54f54..c8ac9e450 100644 --- a/src/modules/Elsa.Workflows.Management/Handlers/RefreshActivityRegistry.cs +++ b/src/modules/Elsa.Workflows.Management/Handlers/RefreshActivityRegistry.cs @@ -1,7 +1,6 @@ using Elsa.Mediator.Contracts; using Elsa.Workflows.Contracts; using Elsa.Workflows.Management.Activities.WorkflowDefinitionActivity; -using Elsa.Workflows.Management.Contracts; using Elsa.Workflows.Management.Entities; using Elsa.Workflows.Management.Notifications; using JetBrains.Annotations; @@ -12,7 +11,7 @@ namespace Elsa.Workflows.Management.Handlers; /// Refreshes the for the provider whenever an is published, retracted or deleted. /// [PublicAPI] -public class RefreshActivityRegistry(IActivityRegistryPopulator activityRegistryPopulator) : +public class RefreshActivityRegistry(IActivityRegistryUpdateService activityRegistryUpdateService) : INotificationHandler, INotificationHandler, INotificationHandler, @@ -31,14 +30,14 @@ public class RefreshActivityRegistry(IActivityRegistryPopulator activityRegistry /// public Task HandleAsync(WorkflowDefinitionRetracted notification, CancellationToken cancellationToken) { - activityRegistryPopulator.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), notification.WorkflowDefinition.Id, cancellationToken); + activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), notification.WorkflowDefinition.Id, cancellationToken); return Task.CompletedTask; } /// public Task HandleAsync(WorkflowDefinitionDeleted notification, CancellationToken cancellationToken) { - activityRegistryPopulator.RemoveDefinitionFromRegistry(typeof(WorkflowDefinitionActivityProvider), notification.DefinitionId, cancellationToken); + activityRegistryUpdateService.RemoveDefinitionFromRegistry(typeof(WorkflowDefinitionActivityProvider), notification.DefinitionId, cancellationToken); return Task.CompletedTask; } @@ -47,7 +46,7 @@ public class RefreshActivityRegistry(IActivityRegistryPopulator activityRegistry { foreach (string id in notification.DefinitionIds) { - activityRegistryPopulator.RemoveDefinitionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id, cancellationToken); + activityRegistryUpdateService.RemoveDefinitionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id, cancellationToken); } return Task.CompletedTask; @@ -62,7 +61,7 @@ public class RefreshActivityRegistry(IActivityRegistryPopulator activityRegistry /// public Task HandleAsync(WorkflowDefinitionVersionDeleted notification, CancellationToken cancellationToken) { - activityRegistryPopulator.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), notification.WorkflowDefinition.Id, cancellationToken); + activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), notification.WorkflowDefinition.Id, cancellationToken); return Task.CompletedTask; } @@ -71,7 +70,7 @@ public class RefreshActivityRegistry(IActivityRegistryPopulator activityRegistry { foreach (string id in notification.Ids) { - activityRegistryPopulator.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id, cancellationToken); + activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id, cancellationToken); } return Task.CompletedTask; @@ -89,9 +88,9 @@ public class RefreshActivityRegistry(IActivityRegistryPopulator activityRegistry private Task UpdateDefinition(string id, bool? usableAsActivity) { if (usableAsActivity.GetValueOrDefault()) - return activityRegistryPopulator.AddToRegistry(typeof(WorkflowDefinitionActivityProvider), id); + return activityRegistryUpdateService.AddToRegistry(typeof(WorkflowDefinitionActivityProvider), id); - activityRegistryPopulator.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id); + activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id); return Task.CompletedTask; } } \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Management/Services/ActivityRegistryPopulator.cs b/src/modules/Elsa.Workflows.Management/Services/ActivityRegistryPopulator.cs index c69c3bf99..0665bf36f 100644 --- a/src/modules/Elsa.Workflows.Management/Services/ActivityRegistryPopulator.cs +++ b/src/modules/Elsa.Workflows.Management/Services/ActivityRegistryPopulator.cs @@ -1,6 +1,5 @@ using Elsa.Workflows.Contracts; using Elsa.Workflows.Management.Contracts; -using Elsa.Workflows.Models; namespace Elsa.Workflows.Management.Services; @@ -14,48 +13,4 @@ public class ActivityRegistryPopulator(IEnumerable providers, { await registry.RefreshDescriptors(providers, cancellationToken); } - - /// - public async Task AddToRegistry(Type providerType, string workflowDefinitionVersionId, CancellationToken cancellationToken = default) - { - var provider = providers.First(x => x.GetType() == providerType); - var descriptors = await provider.GetDescriptorsAsync(cancellationToken); - var descriptorToAdd = descriptors - .SingleOrDefault(d => - d.CustomProperties.TryGetValue("WorkflowDefinitionVersionId", out var val) && - val.ToString() == workflowDefinitionVersionId); - - if (descriptorToAdd is not null) - registry.Add(providerType, descriptorToAdd); - } - - /// - public void RemoveDefinitionFromRegistry(Type providerType, string workflowDefinitionId, CancellationToken cancellationToken = default) - { - var providerDescriptors = registry.ListByProvider(providerType); - - var descriptorsToRemove = providerDescriptors - .Where(d => - d.CustomProperties.TryGetValue("WorkflowDefinitionId", out var val) && - val.ToString() == workflowDefinitionId).ToList(); - - foreach (ActivityDescriptor activityDescriptor in descriptorsToRemove) - { - registry.Remove(providerType, activityDescriptor); - } - } - - /// - public void RemoveDefinitionVersionFromRegistry(Type providerType, string workflowDefinitionVersionId, CancellationToken cancellationToken = default) - { - var providerDescriptors = registry.ListByProvider(providerType); - - var descriptorToRemove = providerDescriptors - .SingleOrDefault(d => - d.CustomProperties.TryGetValue("WorkflowDefinitionVersionId", out var val) && - val.ToString() == workflowDefinitionVersionId); - - if (descriptorToRemove is not null) - registry.Remove(providerType, descriptorToRemove); - } } \ No newline at end of file