diff --git a/src/core/Elsa.Core/Persistence/Specifications/WorkflowDefinitions/LatestOrPublishedWorkflowDefinitionIdSpecification.cs b/src/core/Elsa.Core/Persistence/Specifications/WorkflowDefinitions/LatestOrPublishedWorkflowDefinitionIdSpecification.cs new file mode 100644 index 000000000..f837a0fdc --- /dev/null +++ b/src/core/Elsa.Core/Persistence/Specifications/WorkflowDefinitions/LatestOrPublishedWorkflowDefinitionIdSpecification.cs @@ -0,0 +1,13 @@ +using System; +using System.Linq.Expressions; +using Elsa.Models; + +namespace Elsa.Persistence.Specifications.WorkflowDefinitions +{ + public class LatestOrPublishedWorkflowDefinitionIdSpecification : Specification + { + public string WorkflowDefinitionId { get; set; } + public LatestOrPublishedWorkflowDefinitionIdSpecification(string workflowDefinitionId) => WorkflowDefinitionId = workflowDefinitionId; + public override Expression> ToExpression() => x => x.DefinitionId == WorkflowDefinitionId && (x.IsLatest || x.IsPublished); + } +} \ No newline at end of file diff --git a/src/core/Elsa.Core/Services/Workflows/WorkflowPublisher.cs b/src/core/Elsa.Core/Services/Workflows/WorkflowPublisher.cs index e6a5240a1..abf78dd45 100644 --- a/src/core/Elsa.Core/Services/Workflows/WorkflowPublisher.cs +++ b/src/core/Elsa.Core/Services/Workflows/WorkflowPublisher.cs @@ -4,7 +4,10 @@ using System.Threading.Tasks; using Elsa.Events; using Elsa.Models; using Elsa.Persistence; +using Elsa.Persistence.Specifications; +using Elsa.Persistence.Specifications.WorkflowDefinitions; using MediatR; +using Open.Linq.AsyncExtensions; using WorkflowDefinitionIdSpecification = Elsa.Persistence.Specifications.WorkflowInstances.WorkflowDefinitionIdSpecification; namespace Elsa.Services.Workflows @@ -57,18 +60,18 @@ namespace Elsa.Services.Workflows public async Task PublishAsync(WorkflowDefinition workflowDefinition, CancellationToken cancellationToken = default) { - var publishedDefinition = await _workflowDefinitionStore.FindByDefinitionIdAsync( - workflowDefinition.DefinitionId, - VersionOptions.LatestOrPublished, - cancellationToken); + var definitionId = workflowDefinition.DefinitionId; + + // Reset current latest and published definitions. + var publishedAndOrLatestDefinitions = await _workflowDefinitionStore.FindManyAsync(new LatestOrPublishedWorkflowDefinitionIdSpecification(definitionId), cancellationToken: cancellationToken).ToList(); - if (publishedDefinition != null) + foreach (var publishedAndOrLatestDefinition in publishedAndOrLatestDefinitions) { - publishedDefinition.IsPublished = false; - publishedDefinition.IsLatest = false; - await _workflowDefinitionStore.SaveAsync(publishedDefinition, cancellationToken); + publishedAndOrLatestDefinition.IsPublished = false; + publishedAndOrLatestDefinition.IsLatest = false; + await _workflowDefinitionStore.SaveAsync(publishedAndOrLatestDefinition, cancellationToken); } - + if (workflowDefinition.IsPublished) workflowDefinition.Version++; else diff --git a/src/persistence/Elsa.Persistence.YesSql/Stores/YesSqlWorkflowDefinitionStore.cs b/src/persistence/Elsa.Persistence.YesSql/Stores/YesSqlWorkflowDefinitionStore.cs index 57f00c63e..7f5f3e789 100644 --- a/src/persistence/Elsa.Persistence.YesSql/Stores/YesSqlWorkflowDefinitionStore.cs +++ b/src/persistence/Elsa.Persistence.YesSql/Stores/YesSqlWorkflowDefinitionStore.cs @@ -10,6 +10,7 @@ using Elsa.Persistence.YesSql.Indexes; using Elsa.Persistence.YesSql.Services; using Microsoft.Extensions.Logging; using YesSql; +using YesSql.Services; using IIdGenerator = Elsa.Services.IIdGenerator; namespace Elsa.Persistence.YesSql.Stores @@ -27,6 +28,10 @@ namespace Elsa.Persistence.YesSql.Stores return specification switch { EntityIdSpecification s => Query(session, x => x.DefinitionId == s.Id), + LatestOrPublishedWorkflowDefinitionIdSpecification s => Query(session, x => x.DefinitionId == s.WorkflowDefinitionId), + WorkflowDefinitionIdSpecification s => Query(session, x => x.DefinitionId == s.Id), + ManyWorkflowDefinitionIdsSpecification s => Query(session, x => x.DefinitionId.IsIn(s.Ids)), + WorkflowDefinitionVersionIdSpecification s => Query(session, x => x.DefinitionVersionId == s.VersionId), VersionOptionsSpecification s => Query(session).WithVersion(s.VersionOptions), _ => AutoMapSpecification(session, specification) };