< Summary

Information
Class: Elsa.AI.Host.Services.WorkflowGroundingMapper
Assembly: Elsa.AI.Host
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.AI.Host/Services/WorkflowGroundingMapper.cs
Line coverage
69%
Covered lines: 53
Uncovered lines: 23
Coverable lines: 76
Total lines: 127
Line coverage: 69.7%
Branch coverage
91%
Covered branches: 31
Total branches: 34
Branch coverage: 91.1%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Map(...)100%210%
Map(...)100%1184.21%
MapGraph(...)100%1176.92%
GetGraph(...)50%22100%
TryParseWorkflowJson(...)50%5457.14%
FindActivities()100%2424100%
ReadString(...)100%66100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.AI.Host/Services/WorkflowGroundingMapper.cs

#LineLine coverage
 1using System.Text.Json.Nodes;
 2using Elsa.AI.Abstractions.Models;
 3using Elsa.Workflows.Management.Entities;
 4using Elsa.Workflows.Management.Models;
 5
 6namespace Elsa.AI.Host.Services;
 7
 8public class WorkflowGroundingMapper
 9{
 10    public WorkflowGroundingSummary Map(WorkflowDefinitionSummary summary) =>
 011        new()
 012        {
 013            Id = summary.Id,
 014            DefinitionId = summary.DefinitionId,
 015            Name = summary.Name,
 016            Description = summary.Description,
 017            Version = summary.Version,
 018            IsLatest = summary.IsLatest,
 019            IsPublished = summary.IsPublished,
 020            IsReadonly = summary.IsReadonly,
 021            MaterializerName = summary.MaterializerName,
 022            ProviderName = summary.ProviderName,
 023            CreatedAt = summary.CreatedAt
 024        };
 25
 26    public WorkflowGroundingSummary Map(WorkflowDefinition definition)
 27    {
 128        var graph = GetGraph(definition);
 129        return new WorkflowGroundingSummary
 130        {
 131            Id = definition.Id,
 132            DefinitionId = definition.DefinitionId,
 133            Name = definition.Name,
 134            Description = definition.Description,
 135            Version = definition.Version,
 136            IsLatest = definition.IsLatest,
 137            IsPublished = definition.IsPublished,
 138            IsReadonly = definition.IsReadonly,
 139            MaterializerName = definition.MaterializerName,
 140            ProviderName = definition.ProviderName,
 141            CreatedAt = definition.CreatedAt,
 142            ActivityTypes = graph.ActivityTypes,
 043            Variables = definition.Variables.Select(x => x.Name).Where(x => !string.IsNullOrWhiteSpace(x)).Distinct(Stri
 044            Inputs = definition.Inputs.Select(x => x.Name).Where(x => !string.IsNullOrWhiteSpace(x)).Distinct(StringComp
 045            Outputs = definition.Outputs.Select(x => x.Name).Where(x => !string.IsNullOrWhiteSpace(x)).Distinct(StringCo
 146        };
 47    }
 48
 49    public JsonObject MapGraph(WorkflowDefinition definition)
 50    {
 151        var graph = GetGraph(definition);
 152        return new JsonObject
 153        {
 154            ["definitionId"] = definition.DefinitionId,
 155            ["versionId"] = definition.Id,
 156            ["version"] = definition.Version,
 157            ["activityTypes"] = AIGroundingJson.ToJsonArray(graph.ActivityTypes),
 158            ["activityCount"] = graph.ActivityCount,
 159            ["activities"] = AIGroundingJson.ToJsonArray(graph.Activities),
 060            ["variables"] = AIGroundingJson.ToJsonArray(definition.Variables.Select(x => x.Name).Where(x => !string.IsNu
 061            ["inputs"] = AIGroundingJson.ToJsonArray(definition.Inputs.Select(x => x.Name).Where(x => !string.IsNullOrWh
 062            ["outputs"] = AIGroundingJson.ToJsonArray(definition.Outputs.Select(x => x.Name).Where(x => !string.IsNullOr
 163        };
 64    }
 65
 66    public WorkflowGraphSummary GetGraph(WorkflowDefinition definition)
 67    {
 368        var root = TryParseWorkflowJson(definition);
 369        var activities = root == null ? [] : FindActivities(root).Take(200).ToList();
 370        var activityTypes = activities
 471            .Select(x => x.Type)
 472            .Where(x => !string.IsNullOrWhiteSpace(x))
 373            .Distinct(StringComparer.OrdinalIgnoreCase)
 374            .Order(StringComparer.OrdinalIgnoreCase)
 375            .ToList();
 76
 377        return new WorkflowGraphSummary(activities, activityTypes, activities.Count);
 78    }
 79
 80    private static JsonNode? TryParseWorkflowJson(WorkflowDefinition definition)
 81    {
 382        var json = !string.IsNullOrWhiteSpace(definition.OriginalSource) ? definition.OriginalSource : definition.String
 383        if (string.IsNullOrWhiteSpace(json))
 084            return null;
 85
 86        try
 87        {
 388            return JsonNode.Parse(json);
 89        }
 090        catch
 91        {
 092            return null;
 93        }
 394    }
 95
 96    private static IEnumerable<WorkflowActivitySummary> FindActivities(JsonNode node)
 97    {
 1898        if (node is JsonObject jsonObject)
 99        {
 7100            var type = ReadString(jsonObject, "type") ?? ReadString(jsonObject, "typeName") ?? ReadString(jsonObject, "a
 7101            var id = ReadString(jsonObject, "id") ?? ReadString(jsonObject, "activityId") ?? ReadString(jsonObject, "nod
 7102            if (!string.IsNullOrWhiteSpace(type))
 4103                yield return new WorkflowActivitySummary(id, type, ReadString(jsonObject, "name") ?? ReadString(jsonObje
 104
 50105            foreach (var child in jsonObject.Select(x => x.Value).OfType<JsonNode>())
 106            {
 34107                foreach (var activity in FindActivities(child))
 5108                    yield return activity;
 109            }
 110        }
 11111        else if (node is JsonArray jsonArray)
 112        {
 12113            foreach (var child in jsonArray.OfType<JsonNode>())
 114            {
 12115                foreach (var activity in FindActivities(child))
 3116                    yield return activity;
 117            }
 118        }
 18119    }
 120
 121    private static string? ReadString(JsonObject jsonObject, string name) =>
 35122        jsonObject.TryGetPropertyValue(name, out var node) && node is JsonValue value && value.TryGetValue<string>(out v
 123}
 124
 125public record WorkflowGraphSummary(IReadOnlyCollection<WorkflowActivitySummary> Activities, IReadOnlyCollection<string> 
 126
 127public record WorkflowActivitySummary(string? Id, string Type, string? Name);