Fix WorkflowPublisher

Fixes #1293
This commit is contained in:
Sipke Schoorstra 2021-08-09 13:15:34 +02:00
parent 9ef639689b
commit 72fcfd7ff4
3 changed files with 30 additions and 9 deletions

View file

@ -0,0 +1,13 @@
using System;
using System.Linq.Expressions;
using Elsa.Models;
namespace Elsa.Persistence.Specifications.WorkflowDefinitions
{
public class LatestOrPublishedWorkflowDefinitionIdSpecification : Specification<WorkflowDefinition>
{
public string WorkflowDefinitionId { get; set; }
public LatestOrPublishedWorkflowDefinitionIdSpecification(string workflowDefinitionId) => WorkflowDefinitionId = workflowDefinitionId;
public override Expression<Func<WorkflowDefinition, bool>> ToExpression() => x => x.DefinitionId == WorkflowDefinitionId && (x.IsLatest || x.IsPublished);
}
}

View file

@ -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<WorkflowDefinition> 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

View file

@ -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<WorkflowDefinition> s => Query<WorkflowDefinitionIndex>(session, x => x.DefinitionId == s.Id),
LatestOrPublishedWorkflowDefinitionIdSpecification s => Query<WorkflowDefinitionIndex>(session, x => x.DefinitionId == s.WorkflowDefinitionId),
WorkflowDefinitionIdSpecification s => Query<WorkflowDefinitionIndex>(session, x => x.DefinitionId == s.Id),
ManyWorkflowDefinitionIdsSpecification s => Query<WorkflowDefinitionIndex>(session, x => x.DefinitionId.IsIn(s.Ids)),
WorkflowDefinitionVersionIdSpecification s => Query<WorkflowDefinitionIndex>(session, x => x.DefinitionVersionId == s.VersionId),
VersionOptionsSpecification s => Query<WorkflowDefinitionIndex>(session).WithVersion(s.VersionOptions),
_ => AutoMapSpecification<WorkflowDefinitionIndex>(session, specification)
};