Skip to content

Commit

Permalink
Made ActivityRegistryUpdateService provider specific
Browse files Browse the repository at this point in the history
  • Loading branch information
raymonddenhaan committed Jun 7, 2024
1 parent 90d9561 commit c0ee30b
Show file tree
Hide file tree
Showing 7 changed files with 62 additions and 63 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using Elsa.MassTransit.Messages;
using Elsa.Workflows.Contracts;
using Elsa.Workflows.Management.Activities.WorkflowDefinitionActivity;
using Elsa.Workflows.Management.Contracts;
using JetBrains.Annotations;
using MassTransit;

Expand All @@ -10,7 +9,7 @@ namespace Elsa.MassTransit.Consumers;
/// Consumes messages related to workflow definition changes.
/// </summary>
[PublicAPI]
public class WorkflowDefinitionEventsConsumer(IActivityRegistryUpdateService activityRegistryUpdateService) :
public class WorkflowDefinitionEventsConsumer(IWorkflowDefinitionActivityRegistryUpdater workflowDefinitionActivityRegistryUpdater) :
IConsumer<WorkflowDefinitionCreated>,
IConsumer<WorkflowDefinitionDeleted>,
IConsumer<WorkflowDefinitionPublished>,
Expand All @@ -29,7 +28,7 @@ public Task Consume(ConsumeContext<WorkflowDefinitionCreated> context)
/// <inheritdoc />
public Task Consume(ConsumeContext<WorkflowDefinitionDeleted> context)
{
activityRegistryUpdateService.RemoveDefinitionFromRegistry(typeof(WorkflowDefinitionActivityProvider), context.Message.Id);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionFromRegistry(context.Message.Id);
return Task.CompletedTask;
}

Expand All @@ -42,7 +41,7 @@ public Task Consume(ConsumeContext<WorkflowDefinitionPublished> context)
/// <inheritdoc />
public Task Consume(ConsumeContext<WorkflowDefinitionRetracted> context)
{
activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), context.Message.Id);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionVersionFromRegistry(context.Message.Id);
return Task.CompletedTask;
}

Expand All @@ -51,7 +50,7 @@ public Task Consume(ConsumeContext<WorkflowDefinitionsDeleted> context)
{
foreach (var id in context.Message.Ids)
{
activityRegistryUpdateService.RemoveDefinitionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionFromRegistry(id);
}

return Task.CompletedTask;
Expand All @@ -60,7 +59,7 @@ public Task Consume(ConsumeContext<WorkflowDefinitionsDeleted> context)
/// <inheritdoc />
public Task Consume(ConsumeContext<WorkflowDefinitionVersionDeleted> context)
{
activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), context.Message.Id);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionVersionFromRegistry(context.Message.Id);
return Task.CompletedTask;
}

Expand All @@ -69,7 +68,7 @@ public Task Consume(ConsumeContext<WorkflowDefinitionVersionsDeleted> context)
{
foreach (var id in context.Message.Ids)
{
activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionVersionFromRegistry(id);
}

return Task.CompletedTask;
Expand All @@ -87,9 +86,9 @@ public async Task Consume(ConsumeContext<WorkflowDefinitionVersionsUpdated> cont
private Task UpdateDefinition(string id, bool usableAsActivity)
{
if (usableAsActivity)
return activityRegistryUpdateService.AddToRegistry(typeof(WorkflowDefinitionActivityProvider), id);
return workflowDefinitionActivityRegistryUpdater.AddToRegistry(id);

activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionVersionFromRegistry(id);
return Task.CompletedTask;
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,6 @@ private void AddElsaCore(IServiceCollection services)
.AddSingleton<IActivityDescriber, ActivityDescriber>()
.AddSingleton<IActivityRegistry, ActivityRegistry>()
.AddScoped<IActivityRegistryLookupService, ActivityRegistryLookupService>()
.AddScoped<IActivityRegistryUpdateService, ActivityRegistryUpdateService>()
.AddSingleton<IPropertyDefaultValueResolver, PropertyDefaultValueResolver>()
.AddSingleton<IPropertyUIHandlerResolver, PropertyUIHandlerResolver>()
.AddSingleton<IActivityFactory, ActivityFactory>()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
namespace Elsa.Workflows.Management.Contracts;

/// <summary>
/// Represents a service for updating the activity registry.
/// </summary>
public interface IWorkflowDefinitionActivityRegistryUpdater
{
/// <summary>
/// Tries to add a workflow as an activity to the registry.
/// </summary>
/// <param name="workflowDefinitionId">The ID of the workflow definition.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task AddToRegistry(string workflowDefinitionId, CancellationToken cancellationToken = default);

/// <summary>
/// Removes workflow definition activities from the <see cref="Elsa.Workflows.Contracts.IActivityRegistry"/>.
/// </summary>
/// <param name="workflowDefinitionId">The ID of the workflow definition to remove.</param>
void RemoveDefinitionFromRegistry(string workflowDefinitionId);


/// <summary>
/// Removes a workflow definition version activity from the <see cref="Elsa.Workflows.Contracts.IActivityRegistry"/>.
/// </summary>
/// <param name="workflowDefinitionVersionId">The ID of the workflow definition to remove.</param>
void RemoveDefinitionVersionFromRegistry(string workflowDefinitionVersionId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,9 @@ public override void Apply()
.AddMemoryStore<WorkflowDefinition, MemoryWorkflowDefinitionStore>()
.AddMemoryStore<WorkflowInstance, MemoryWorkflowInstanceStore>()
.AddActivityProvider<TypedActivityProvider>()
.AddActivityProvider<WorkflowDefinitionActivityProvider>()
.AddScoped<WorkflowDefinitionActivityProvider>()
.AddScoped<IWorkflowDefinitionActivityRegistryUpdater, WorkflowDefinitionActivityRegistryUpdater>()
.AddScoped<IWorkflowDefinitionService, WorkflowDefinitionService>()
.AddScoped<IWorkflowSerializer, WorkflowSerializer>()
.AddScoped<IWorkflowValidator, WorkflowValidator>()
Expand All @@ -216,7 +219,6 @@ public override void Apply()
.AddScoped<IWorkflowMaterializer, ClrWorkflowMaterializer>()
.AddScoped<IWorkflowMaterializer, JsonWorkflowMaterializer>()
.AddScoped<IActivityResolver, WorkflowDefinitionActivityResolver>()
.AddActivityProvider<WorkflowDefinitionActivityProvider>()
.AddScoped<WorkflowDefinitionMapper>()
.AddSingleton<VariableDefinitionMapper>()
.AddSingleton<WorkflowStateMapper>()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
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;
Expand All @@ -11,7 +12,7 @@ namespace Elsa.Workflows.Management.Handlers;
/// Refreshes the <see cref="IActivityRegistry"/> for the <see cref="WorkflowDefinitionActivityProvider"/> provider whenever an <see cref="WorkflowDefinition"/> is published, retracted or deleted.
/// </summary>
[PublicAPI]
public class RefreshActivityRegistry(IActivityRegistryUpdateService activityRegistryUpdateService) :
public class RefreshActivityRegistry(IWorkflowDefinitionActivityRegistryUpdater workflowDefinitionActivityRegistryUpdater) :
INotificationHandler<WorkflowDefinitionPublished>,
INotificationHandler<WorkflowDefinitionRetracted>,
INotificationHandler<WorkflowDefinitionDeleted>,
Expand All @@ -30,14 +31,14 @@ public Task HandleAsync(WorkflowDefinitionPublished notification, CancellationTo
/// <inheritdoc />
public Task HandleAsync(WorkflowDefinitionRetracted notification, CancellationToken cancellationToken)
{
activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), notification.WorkflowDefinition.Id, cancellationToken);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionVersionFromRegistry(notification.WorkflowDefinition.Id);
return Task.CompletedTask;
}

/// <inheritdoc />
public Task HandleAsync(WorkflowDefinitionDeleted notification, CancellationToken cancellationToken)
{
activityRegistryUpdateService.RemoveDefinitionFromRegistry(typeof(WorkflowDefinitionActivityProvider), notification.DefinitionId, cancellationToken);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionFromRegistry(notification.DefinitionId);
return Task.CompletedTask;
}

Expand All @@ -46,7 +47,7 @@ public Task HandleAsync(WorkflowDefinitionsDeleted notification, CancellationTok
{
foreach (string id in notification.DefinitionIds)
{
activityRegistryUpdateService.RemoveDefinitionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id, cancellationToken);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionFromRegistry(id);
}

return Task.CompletedTask;
Expand All @@ -61,7 +62,7 @@ public Task HandleAsync(WorkflowDefinitionCreated notification, CancellationToke
/// <inheritdoc />
public Task HandleAsync(WorkflowDefinitionVersionDeleted notification, CancellationToken cancellationToken)
{
activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), notification.WorkflowDefinition.Id, cancellationToken);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionVersionFromRegistry(notification.WorkflowDefinition.Id);
return Task.CompletedTask;
}

Expand All @@ -70,7 +71,7 @@ public Task HandleAsync(WorkflowDefinitionVersionsDeleted notification, Cancella
{
foreach (string id in notification.Ids)
{
activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id, cancellationToken);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionVersionFromRegistry(id);
}

return Task.CompletedTask;
Expand All @@ -88,9 +89,9 @@ public async Task HandleAsync(WorkflowDefinitionVersionsUpdated notification, Ca
private Task UpdateDefinition(string id, bool? usableAsActivity)
{
if (usableAsActivity.GetValueOrDefault())
return activityRegistryUpdateService.AddToRegistry(typeof(WorkflowDefinitionActivityProvider), id);
return workflowDefinitionActivityRegistryUpdater.AddToRegistry(id);

activityRegistryUpdateService.RemoveDefinitionVersionFromRegistry(typeof(WorkflowDefinitionActivityProvider), id);
workflowDefinitionActivityRegistryUpdater.RemoveDefinitionVersionFromRegistry(id);
return Task.CompletedTask;
}
}
Original file line number Diff line number Diff line change
@@ -1,31 +1,34 @@
using Elsa.Workflows.Contracts;
using Elsa.Workflows.Management.Activities.WorkflowDefinitionActivity;
using Elsa.Workflows.Management.Contracts;
using Elsa.Workflows.Models;

namespace Elsa.Workflows.Services;
namespace Elsa.Workflows.Management.Services;

/// <summary>
/// Service responsible for updating the activity registry based on activity providers.
/// </summary>
public class ActivityRegistryUpdateService(IEnumerable<IActivityProvider> providers, IActivityRegistry registry) : IActivityRegistryUpdateService
public class WorkflowDefinitionActivityRegistryUpdater(WorkflowDefinitionActivityProvider provider, IActivityRegistry registry) : IWorkflowDefinitionActivityRegistryUpdater
{
private readonly Type _providerType = typeof(WorkflowDefinitionActivityProvider);

/// <inheritdoc />
public async Task AddToRegistry(Type providerType, string workflowDefinitionVersionId, CancellationToken cancellationToken = default)
public async Task AddToRegistry(string workflowDefinitionVersionId, CancellationToken cancellationToken)
{
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);
registry.Add(_providerType, descriptorToAdd);
}

/// <inheritdoc />
public void RemoveDefinitionFromRegistry(Type providerType, string workflowDefinitionId, CancellationToken cancellationToken = default)
public void RemoveDefinitionFromRegistry(string workflowDefinitionId)
{
var providerDescriptors = registry.ListByProvider(providerType);
var providerDescriptors = registry.ListByProvider(_providerType);

var descriptorsToRemove = providerDescriptors
.Where(d =>
Expand All @@ -34,21 +37,21 @@ public void RemoveDefinitionFromRegistry(Type providerType, string workflowDefin

foreach (ActivityDescriptor activityDescriptor in descriptorsToRemove)
{
registry.Remove(providerType, activityDescriptor);
registry.Remove(_providerType, activityDescriptor);
}
}

/// <inheritdoc />
public void RemoveDefinitionVersionFromRegistry(Type providerType, string workflowDefinitionVersionId, CancellationToken cancellationToken = default)
public void RemoveDefinitionVersionFromRegistry(string workflowDefinitionVersionId)
{
var providerDescriptors = registry.ListByProvider(providerType);
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);
registry.Remove(_providerType, descriptorToRemove);
}
}

0 comments on commit c0ee30b

Please sign in to comment.