add work flow instance

This commit is contained in:
Jelger Ribbers 2025-12-15 10:57:10 +01:00
parent ae1bb77dec
commit 82acecdbd2
4 changed files with 42 additions and 9 deletions

View file

@ -0,0 +1,18 @@
using Elsa.Workflows.Management.Entities;
namespace Elsa.Workflows.Api;
/// <summary>
/// Defines a contract for generating a filename suitable for exporting a workflow instance.
/// </summary>
public interface IWorkflowInstanceExportNameProvider
{
/// <summary>
/// Generates a filename for a workflow instance export.
/// </summary>
/// <param name="instance">The workflow instance being exported.</param>
/// <param name="model">The export model representing the instance (optional).</param>
/// <param name="cancellationToken">Cancellation token.</param>
/// <returns>A filename safe for saving to disk.</returns>
Task<string> GetFileNameAsync(WorkflowInstance instance, object model, CancellationToken cancellationToken = default);
}

View file

@ -31,6 +31,7 @@ internal class Export : ElsaEndpointWithMapper<Request, WorkflowInstanceMapper>
private readonly IWorkflowStateSerializer _workflowStateSerializer;
private readonly IPayloadSerializer _payloadSerializer;
private readonly ISafeSerializer _safeSerializer;
private readonly IWorkflowInstanceExportNameProvider _workFlowInstanceExportNameProvider;
/// <inheritdoc />
public Export(
@ -40,7 +41,8 @@ internal class Export : ElsaEndpointWithMapper<Request, WorkflowInstanceMapper>
IBookmarkStore bookmarkStore,
IWorkflowStateSerializer workflowStateSerializer,
IPayloadSerializer payloadSerializer,
ISafeSerializer safeSerializer)
ISafeSerializer safeSerializer,
IWorkflowInstanceExportNameProvider workFlowInstanceExportNameProvider)
{
_workflowInstanceStore = workflowInstanceStore;
_activityExecutionStore = activityExecutionStore;
@ -49,6 +51,7 @@ internal class Export : ElsaEndpointWithMapper<Request, WorkflowInstanceMapper>
_workflowStateSerializer = workflowStateSerializer;
_payloadSerializer = payloadSerializer;
_safeSerializer = safeSerializer;
_workFlowInstanceExportNameProvider = workFlowInstanceExportNameProvider;
}
/// <inheritdoc />
@ -85,7 +88,9 @@ internal class Export : ElsaEndpointWithMapper<Request, WorkflowInstanceMapper>
{
var model = await CreateExportModelAsync(request, instance, cancellationToken);
var binaryJson = SerializeWorkflowInstance(model);
var fileName = GetFileName(instance.WorkflowState);
var fileName = await _workFlowInstanceExportNameProvider.GetFileNameAsync(instance, model, cancellationToken);
var entry = zipArchive.CreateEntry(fileName, CompressionLevel.Optimal);
await using var entryStream = entry.Open();
await entryStream.WriteAsync(binaryJson, cancellationToken);
@ -109,7 +114,7 @@ internal class Export : ElsaEndpointWithMapper<Request, WorkflowInstanceMapper>
var model = await CreateExportModelAsync(request, instance, cancellationToken);
var binaryJson = SerializeWorkflowInstance(model);
var fileName = GetFileName(instance.WorkflowState);
var fileName = await _workFlowInstanceExportNameProvider.GetFileNameAsync(instance, model, cancellationToken);
await Send.BytesAsync(binaryJson, fileName, cancellation: cancellationToken);
}
@ -168,12 +173,6 @@ internal class Export : ElsaEndpointWithMapper<Request, WorkflowInstanceMapper>
return page.Items;
}
private static string GetFileName(WorkflowState instance)
{
var fileName = $"workflow-instance-{instance.Id.ToLowerInvariant()}.json";
return fileName;
}
private static byte[] SerializeWorkflowInstance(ExportedWorkflowState model)
{
var binaryJson = JsonSerializer.SerializeToUtf8Bytes(model);

View file

@ -41,5 +41,6 @@ public class WorkflowsApiFeature(IModule module) : FeatureBase(module)
{
options.AddPolicy(AuthorizationPolicies.NotReadOnlyPolicy, policy => policy.AddRequirements(new NotReadOnlyRequirement()));
});
Services.AddScoped<IWorkflowInstanceExportNameProvider, DefaultWorkflowInstanceExportNameProvider>();
}
}

View file

@ -0,0 +1,15 @@
using Elsa.Workflows.Management.Entities;
namespace Elsa.Workflows.Api;
/// <summary>
/// Provides a default implementation for generating export file names for workflow instances.
/// </summary>
public class DefaultWorkflowInstanceExportNameProvider : IWorkflowInstanceExportNameProvider
{
public Task<string> GetFileNameAsync(WorkflowInstance instance, object model, CancellationToken cancellationToken = default)
{
var fileName = $"workflow-instance-{instance.Id.ToLowerInvariant()}.json";
return Task.FromResult(fileName);
}
}