Refactor draft version selection

This commit is contained in:
Sipke Schoorstra 2023-01-30 17:29:54 +01:00
parent 5234999403
commit 41b356a02b
5 changed files with 17 additions and 8 deletions

View file

@ -1,5 +1,6 @@
using System.Text.Json;
using Elsa.Abstractions;
using Elsa.Common.Models;
using Elsa.Workflows.Api.Models;
using Elsa.Workflows.Core.Serialization;
using Elsa.Workflows.Management.Mappers;
@ -48,7 +49,7 @@ internal class Import : ElsaEndpoint<WorkflowDefinitionRequest, WorkflowDefiniti
// Get a workflow draft version.
var draft = !string.IsNullOrWhiteSpace(definitionId)
? await _workflowDefinitionPublisher.GetDraftAsync(definitionId, cancellationToken:cancellationToken)
? await _workflowDefinitionPublisher.GetDraftAsync(definitionId, VersionOptions.Latest, cancellationToken)
: default;
var isNew = draft == null;

View file

@ -1,5 +1,6 @@
using System.Text.Json;
using Elsa.Abstractions;
using Elsa.Common.Models;
using Elsa.Workflows.Api.Models;
using Elsa.Workflows.Core.Activities;
using Elsa.Workflows.Core.Serialization;
@ -37,10 +38,18 @@ internal class Post : ElsaEndpoint<WorkflowDefinitionRequest, WorkflowDefinition
var definitionId = request.DefinitionId;
// Get a workflow draft version.
var draftVersion = request.Version != null ? VersionOptions.SpecificVersion(request.Version.Value) : VersionOptions.Latest;
var draft = !string.IsNullOrWhiteSpace(definitionId)
? await _workflowDefinitionPublisher.GetDraftAsync(definitionId, request.Version, cancellationToken)
? await _workflowDefinitionPublisher.GetDraftAsync(definitionId, draftVersion, cancellationToken)
: default;
if (draft == null && request.Version != null)
{
AddError("The requested version does not exist");
await SendErrorsAsync(cancellation: cancellationToken);
}
var isNew = draft == null;
// Create a new workflow in case no existing definition was found.

View file

@ -87,15 +87,13 @@ public class WorkflowDefinitionManager : IWorkflowDefinitionManager
var publishedAndLatestVersions = (await _store.FindManyByDefinitionIdAsync(definitionId, VersionOptions.LatestAndPublished, cancellationToken)).ToList();
if (publishedAndLatestVersions.Any(v => v.Version == version))
{
throw new Exception("Latest or published versions cannot be reverted");
}
var latestVersion = publishedAndLatestVersions.First(v => v.IsLatest);
latestVersion.IsLatest = false;
await _store.SaveAsync(latestVersion, cancellationToken);
var draft = await _workflowPublisher.GetDraftAsync(definitionId, version, cancellationToken);
var draft = await _workflowPublisher.GetDraftAsync(definitionId, VersionOptions.SpecificVersion(version), cancellationToken);
draft!.Id = _identityGenerator.GenerateId();
draft.Version = latestVersion.Version + 1;
draft.IsLatest = true;

View file

@ -121,9 +121,9 @@ public class WorkflowDefinitionPublisher : IWorkflowDefinitionPublisher
}
/// <inheritdoc />
public async Task<WorkflowDefinition?> GetDraftAsync(string definitionId, int? version, CancellationToken cancellationToken = default)
public async Task<WorkflowDefinition?> GetDraftAsync(string definitionId, VersionOptions versionOptions, CancellationToken cancellationToken = default)
{
var definition = (await _workflowDefinitionStore.FindManyByDefinitionIdAsync(definitionId, version.HasValue ? VersionOptions.SpecificVersion(version.Value) : VersionOptions.Latest, cancellationToken)).FirstOrDefault();
var definition = (await _workflowDefinitionStore.FindManyByDefinitionIdAsync(definitionId, versionOptions, cancellationToken)).FirstOrDefault();
if (definition == null)
return null;

View file

@ -1,3 +1,4 @@
using Elsa.Common.Models;
using Elsa.Workflows.Management.Entities;
namespace Elsa.Workflows.Management.Services;
@ -9,6 +10,6 @@ public interface IWorkflowDefinitionPublisher
Task<WorkflowDefinition> PublishAsync(WorkflowDefinition definition, CancellationToken cancellationToken = default);
Task<WorkflowDefinition?> RetractAsync(string definitionId, CancellationToken cancellationToken = default);
Task<WorkflowDefinition> RetractAsync(WorkflowDefinition definition, CancellationToken cancellationToken = default);
Task<WorkflowDefinition?> GetDraftAsync(string definitionId, int? version = null, CancellationToken cancellationToken = default);
Task<WorkflowDefinition?> GetDraftAsync(string definitionId, VersionOptions versionOptions, CancellationToken cancellationToken = default);
Task<WorkflowDefinition> SaveDraftAsync(WorkflowDefinition definition, CancellationToken cancellationToken = default);
}