add work flow instance
This commit is contained in:
parent
ae1bb77dec
commit
82acecdbd2
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -41,5 +41,6 @@ public class WorkflowsApiFeature(IModule module) : FeatureBase(module)
|
|||
{
|
||||
options.AddPolicy(AuthorizationPolicies.NotReadOnlyPolicy, policy => policy.AddRequirements(new NotReadOnlyRequirement()));
|
||||
});
|
||||
Services.AddScoped<IWorkflowInstanceExportNameProvider, DefaultWorkflowInstanceExportNameProvider>();
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue