< Summary

Information
Class: Elsa.UserTasks.Handlers.UserTaskBookmarkPersistedHandler
Assembly: Elsa.UserTasks
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.UserTasks/Handlers/UserTaskBookmarkPersistedHandler.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 27
Coverable lines: 27
Total lines: 57
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 14
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
HandleAsync()0%7280%
Deserialize(...)0%4260%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.UserTasks/Handlers/UserTaskBookmarkPersistedHandler.cs

#LineLine coverage
 1using System.Text.Json;
 2using Elsa.Common;
 3using Elsa.Mediator.Contracts;
 4using Elsa.UserTasks.Contracts;
 5using Elsa.UserTasks.Models;
 6using Elsa.Workflows.Models;
 7using Elsa.Workflows.Runtime.Notifications;
 8
 9namespace Elsa.UserTasks.Handlers;
 10
 11/// <summary>
 12/// Bridges the workflow bookmark commit notification to the User Tasks projection. This keeps workflow
 13/// and task persistence decoupled: task projection is never written from inside activity execution.
 14/// </summary>
 015public sealed class UserTaskBookmarkPersistedHandler(IUserTaskProjectionService projectionService, ISystemClock clock) :
 16{
 17    public async Task HandleAsync(WorkflowBookmarksPersisted notification, CancellationToken cancellationToken)
 18    {
 019        var materializations = notification.Diff.Added
 020            .Select(Deserialize)
 021            .Where(x => x != null)
 022            .Select(x => x!)
 023            .ToArray();
 024        if (materializations.Length > 0)
 025            await projectionService.ProjectCommittedBookmarksAsync(materializations, cancellationToken);
 26
 027        foreach (var bookmark in notification.Diff.Removed)
 28        {
 029            var materialization = Deserialize(bookmark);
 030            if (materialization?.TaskId == null)
 31                continue;
 032            await projectionService.FinalizeBookmarkRemovalAsync(new UserTaskBookmarkRemoval(
 033                materialization.TenantId,
 034                materialization.TaskId,
 035                bookmark.Id,
 036                clock.UtcNow), cancellationToken);
 37        }
 038    }
 39
 40    private static UserTaskMaterialization? Deserialize(Bookmark bookmark)
 41    {
 42        try
 43        {
 044            return bookmark.Payload switch
 045            {
 046                UserTaskMaterialization materialization => materialization,
 047                JsonElement element => element.Deserialize<UserTaskMaterialization>(),
 048                null => null,
 049                _ => JsonSerializer.Deserialize<UserTaskMaterialization>(JsonSerializer.Serialize(bookmark.Payload))
 050            };
 51        }
 052        catch (JsonException)
 53        {
 054            return null;
 55        }
 056    }
 57}