< Summary

Information
Class: Elsa.Workflows.Management.Services.WorkflowDefinitionManager
Assembly: Elsa.Workflows.Management
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Management/Services/WorkflowDefinitionManager.cs
Line coverage
68%
Covered lines: 60
Uncovered lines: 28
Coverable lines: 88
Total lines: 151
Line coverage: 68.1%
Branch coverage
66%
Covered branches: 8
Total branches: 12
Branch coverage: 66.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
DeleteByDefinitionIdAsync()100%11100%
DeleteByIdAsync()0%620%
BulkDeleteByDefinitionIdsAsync()100%11100%
BulkDeleteByIdsAsync()100%210%
DeleteVersionAsync()50%2290%
DeleteVersionAsync()75%4492.85%
RevertVersionAsync(...)100%210%
EnsureLastVersionIsLatestAsync()100%22100%
EnsureLastVersionIsLatestAsync()100%22100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Management/Services/WorkflowDefinitionManager.cs

#LineLine coverage
 1using Elsa.Common.Models;
 2using Elsa.Mediator.Contracts;
 3using Elsa.Workflows.Management.Entities;
 4using Elsa.Workflows.Management.Filters;
 5using Elsa.Workflows.Management.Notifications;
 6
 7namespace Elsa.Workflows.Management.Services;
 8
 9/// <inheritdoc />
 910public class WorkflowDefinitionManager(
 911    IWorkflowDefinitionStore store,
 912    INotificationSender notificationSender,
 913    IWorkflowDefinitionPublisher workflowPublisher) : IWorkflowDefinitionManager
 14{
 15    /// <inheritdoc />
 16    public async Task<long> DeleteByDefinitionIdAsync(string definitionId, CancellationToken cancellationToken = default
 17    {
 418        await notificationSender.SendAsync(new WorkflowDefinitionDeleting(definitionId), cancellationToken);
 419        var filter = new WorkflowDefinitionFilter
 420        {
 421            DefinitionId = definitionId
 422        };
 423        var count = await store.DeleteAsync(filter, cancellationToken);
 424        await notificationSender.SendAsync(new WorkflowDefinitionDeleted(definitionId), cancellationToken);
 425        return count;
 426    }
 27
 28    /// <inheritdoc />
 29    public async Task<bool> DeleteByIdAsync(string id, CancellationToken cancellationToken = default)
 30    {
 031        var filter = new WorkflowDefinitionFilter
 032        {
 033            Id = id
 034        };
 035        var definition = await store.FindAsync(filter, cancellationToken);
 36
 037        if (definition == null)
 038            return false;
 39
 040        return await DeleteVersionAsync(definition, cancellationToken);
 041    }
 42
 43    /// <inheritdoc />
 44    public async Task<long> BulkDeleteByDefinitionIdsAsync(IEnumerable<string> definitionIds, CancellationToken cancella
 45    {
 246        var definitionIdList = definitionIds.Distinct().ToList();
 247        await notificationSender.SendAsync(new WorkflowDefinitionsDeleting(definitionIdList), cancellationToken);
 248        var filter = new WorkflowDefinitionFilter
 249        {
 250            DefinitionIds = definitionIdList,
 251            IsReadonly = false
 252        };
 253        var count = await store.DeleteAsync(filter, cancellationToken);
 254        await EnsureLastVersionIsLatestAsync(definitionIdList, cancellationToken);
 255        await notificationSender.SendAsync(new WorkflowDefinitionsDeleted(definitionIdList), cancellationToken);
 256        return count;
 257    }
 58
 59    /// <inheritdoc />
 60    public async Task<long> BulkDeleteByIdsAsync(IEnumerable<string> ids, CancellationToken cancellationToken = default)
 61    {
 062        var idList = ids.ToList();
 063        var definitions = await store.FindSummariesAsync(new WorkflowDefinitionFilter
 064        {
 065            Ids = idList
 066        }, cancellationToken);
 067        var definitionIds = definitions.Select(x => x.DefinitionId).Distinct().ToList();
 068        await notificationSender.SendAsync(new WorkflowDefinitionVersionsDeleting(idList), cancellationToken);
 069        var filter = new WorkflowDefinitionFilter
 070        {
 071            Ids = idList
 072        };
 073        var count = await store.DeleteAsync(filter, cancellationToken);
 074        await EnsureLastVersionIsLatestAsync(definitionIds, cancellationToken);
 075        await notificationSender.SendAsync(new WorkflowDefinitionVersionsDeleted(idList), cancellationToken);
 076        return count;
 077    }
 78
 79    /// <inheritdoc />
 80    public async Task<bool> DeleteVersionAsync(string definitionId, int versionToDelete, CancellationToken cancellationT
 81    {
 182        var filter = new WorkflowDefinitionFilter
 183        {
 184            DefinitionId = definitionId,
 185            VersionOptions = VersionOptions.SpecificVersion(versionToDelete)
 186        };
 187        var definitionToDelete = await store.FindAsync(filter, cancellationToken);
 88
 189        if (definitionToDelete == null)
 090            return false;
 91
 192        return await DeleteVersionAsync(definitionToDelete, cancellationToken);
 193    }
 94
 95    /// <inheritdoc />
 96    public async Task<bool> DeleteVersionAsync(WorkflowDefinition definitionToDelete, CancellationToken cancellationToke
 97    {
 198        if (definitionToDelete.IsPublished)
 99        {
 1100            await workflowPublisher.RetractAsync(definitionToDelete, cancellationToken);
 101        }
 102
 1103        await notificationSender.SendAsync(new WorkflowDefinitionVersionDeleting(definitionToDelete), cancellationToken)
 104
 1105        var filter = new WorkflowDefinitionFilter
 1106        {
 1107            Id = definitionToDelete.Id
 1108        };
 1109        var isDeleted = await store.DeleteAsync(filter, cancellationToken) > 0;
 110
 1111        if (!isDeleted)
 0112            return false;
 113
 1114        await EnsureLastVersionIsLatestAsync(definitionToDelete.DefinitionId, cancellationToken);
 1115        await notificationSender.SendAsync(new WorkflowDefinitionVersionDeleted(definitionToDelete), cancellationToken);
 116
 1117        return isDeleted;
 1118    }
 119
 120    /// <inheritdoc />
 121    public Task<WorkflowDefinition> RevertVersionAsync(string definitionId, int version, CancellationToken cancellationT
 122    {
 0123        return workflowPublisher.RevertVersionAsync(definitionId, version, cancellationToken);
 124    }
 125
 126    private async Task EnsureLastVersionIsLatestAsync(IEnumerable<string> definitionIds, CancellationToken cancellationT
 127    {
 12128        foreach (var definitionId in definitionIds)
 4129            await EnsureLastVersionIsLatestAsync(definitionId, cancellationToken);
 2130    }
 131
 132    /// <summary>
 133    /// Ensures that the last version of a workflow definition is marked as "IsLatest = true".
 134    /// </summary>
 135    /// <param name="definitionId">The definition ID.</param>
 136    /// <param name="cancellationToken">The cancellation token.</param>
 137    private async Task EnsureLastVersionIsLatestAsync(string definitionId, CancellationToken cancellationToken)
 138    {
 5139        var filter = new WorkflowDefinitionFilter
 5140        {
 5141            DefinitionId = definitionId
 5142        };
 5143        var lastVersion = await store.FindLastVersionAsync(filter, cancellationToken);
 144
 5145        if (lastVersion is null)
 4146            return;
 147
 1148        lastVersion.IsLatest = true;
 1149        await store.SaveAsync(lastVersion, cancellationToken);
 5150    }
 151}