Add endpoints for listing workflow commit strategies

Introduced two API endpoints to list activity and workflow commit strategy registrations. Updated the project file to include the new directory structure for the endpoints. These endpoints provide unified responses from the respective registry implementations.
This commit is contained in:
Sipke Schoorstra 2025-01-30 15:19:51 +01:00
parent e151810600
commit 166c1bc117
4 changed files with 60 additions and 43 deletions

View file

@ -15,4 +15,8 @@
<ProjectReference Include="..\Elsa.Workflows.Runtime\Elsa.Workflows.Runtime.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Endpoints\CommitStrategies\Workflows\" />
</ItemGroup>
</Project>

View file

@ -0,0 +1,28 @@
using Elsa.Abstractions;
using Elsa.Models;
using Elsa.Workflows.CommitStates;
namespace Elsa.Workflows.Api.Endpoints.CommitStrategies.Activities.List;
/// <summary>
/// Represents an API endpoint that provides a list of registered workflow commit strategies.
/// </summary>
/// <remarks>
/// This class is an implementation of an endpoint that retrieves a collection of workflow commit strategy registrations
/// from a provided registry and returns them in a unified response.
/// </remarks>
internal class List(ICommitStrategyRegistry registry) : ElsaEndpointWithoutRequest<ListResponse<ActivityCommitStrategyRegistration>>
{
public override void Configure()
{
Get("/descriptors/commit-strategies/activities");
ConfigurePermissions("read:commit-strategies");
}
public override Task<ListResponse<ActivityCommitStrategyRegistration>> ExecuteAsync(CancellationToken cancellationToken)
{
var descriptors = registry.ListActivityStrategyRegistrations().ToList();
var response =new ListResponse<ActivityCommitStrategyRegistration>(descriptors);
return Task.FromResult(response);
}
}

View file

@ -1,43 +0,0 @@
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Reflection;
using Elsa.Abstractions;
using Elsa.Extensions;
using Elsa.Models;
using Humanizer;
namespace Elsa.Workflows.Api.Endpoints.CommitStrategies.List;
/// <summary>
/// Returns list of available <see cref="IIncidentStrategy" /> implementations.
/// </summary>
internal class List(IEnumerable<IIncidentStrategy> strategies) : ElsaEndpointWithoutRequest<ListResponse<IncidentStrategyDescriptor>>
{
public override void Configure()
{
Get("/descriptors/incident-strategies");
ConfigurePermissions("read:incident-strategies");
}
public override Task<ListResponse<IncidentStrategyDescriptor>> ExecuteAsync(CancellationToken cancellationToken)
{
var descriptors = strategies.Select(IncidentStrategyDescriptor.FromStrategy).OrderBy(x => x.DisplayName).ToList();
var response =new ListResponse<IncidentStrategyDescriptor>(descriptors);
return Task.FromResult(response);
}
}
internal record IncidentStrategyDescriptor(string DisplayName, string Description, string TypeName)
{
public static IncidentStrategyDescriptor FromStrategy(IIncidentStrategy strategy)
{
var type = strategy.GetType();
var displayNameAttribute = type.GetCustomAttribute<DisplayNameAttribute>();
var descriptionAttribute = type.GetCustomAttribute<DescriptionAttribute>();
var displayAttribute = type.GetCustomAttribute<DisplayAttribute>();
var displayName = displayNameAttribute?.DisplayName ?? displayAttribute?.Name ?? type.Name.Replace("Strategy", "").Humanize();
var description = descriptionAttribute?.Description ?? displayAttribute?.Description ?? "";
return new IncidentStrategyDescriptor(displayName, description, type.GetSimpleAssemblyQualifiedName());
}
}

View file

@ -0,0 +1,28 @@
using Elsa.Abstractions;
using Elsa.Models;
using Elsa.Workflows.CommitStates;
namespace Elsa.Workflows.Api.Endpoints.CommitStrategies.Workflows.List;
/// <summary>
/// Represents an API endpoint that provides a list of registered workflow commit strategies.
/// </summary>
/// <remarks>
/// This class is an implementation of an endpoint that retrieves a collection of workflow commit strategy registrations
/// from a provided registry and returns them in a unified response.
/// </remarks>
internal class List(ICommitStrategyRegistry registry) : ElsaEndpointWithoutRequest<ListResponse<WorkflowCommitStrategyRegistration>>
{
public override void Configure()
{
Get("/descriptors/commit-strategies/workflows");
ConfigurePermissions("read:commit-strategies");
}
public override Task<ListResponse<WorkflowCommitStrategyRegistration>> ExecuteAsync(CancellationToken cancellationToken)
{
var descriptors = registry.ListWorkflowStrategyRegistrations().ToList();
var response =new ListResponse<WorkflowCommitStrategyRegistration>(descriptors);
return Task.FromResult(response);
}
}