| | | 1 | | using Elsa.AI.Abstractions.Models; |
| | | 2 | | |
| | | 3 | | namespace Elsa.AI.Host.Services; |
| | | 4 | | |
| | | 5 | | public class WorkflowProposalDiffService |
| | | 6 | | { |
| | | 7 | | public AIGraphDiff CreateDiff(JsonObject draft, JsonObject? baseline = null) |
| | | 8 | | { |
| | 2 | 9 | | var baselineIds = GetActivityIds(baseline).ToHashSet(StringComparer.OrdinalIgnoreCase); |
| | 2 | 10 | | var draftIds = GetActivityIds(draft).ToHashSet(StringComparer.OrdinalIgnoreCase); |
| | | 11 | | |
| | 2 | 12 | | return new AIGraphDiff |
| | 2 | 13 | | { |
| | 2 | 14 | | AddedActivityIds = draftIds.Except(baselineIds, StringComparer.OrdinalIgnoreCase).Order().ToList(), |
| | 2 | 15 | | RemovedActivityIds = baselineIds.Except(draftIds, StringComparer.OrdinalIgnoreCase).Order().ToList(), |
| | 2 | 16 | | ChangedActivityIds = [], |
| | 2 | 17 | | Data = new JsonObject |
| | 2 | 18 | | { |
| | 2 | 19 | | ["baselineActivityCount"] = baselineIds.Count, |
| | 2 | 20 | | ["draftActivityCount"] = draftIds.Count |
| | 2 | 21 | | } |
| | 2 | 22 | | }; |
| | | 23 | | } |
| | | 24 | | |
| | | 25 | | private static IEnumerable<string> GetActivityIds(JsonNode? node) |
| | | 26 | | { |
| | 22 | 27 | | if (node is JsonObject jsonObject) |
| | | 28 | | { |
| | 8 | 29 | | var type = ReadString(jsonObject, "type") ?? ReadString(jsonObject, "typeName") ?? ReadString(jsonObject, "a |
| | 8 | 30 | | var id = ReadString(jsonObject, "id") ?? ReadString(jsonObject, "activityId") ?? ReadString(jsonObject, "nod |
| | 8 | 31 | | if (!string.IsNullOrWhiteSpace(type) && !string.IsNullOrWhiteSpace(id)) |
| | 5 | 32 | | yield return id; |
| | | 33 | | |
| | 55 | 34 | | foreach (var child in jsonObject.Select(x => x.Value)) |
| | | 35 | | { |
| | 36 | 36 | | foreach (var childId in GetActivityIds(child)) |
| | 5 | 37 | | yield return childId; |
| | | 38 | | } |
| | | 39 | | } |
| | 14 | 40 | | else if (node is JsonArray jsonArray) |
| | | 41 | | { |
| | 16 | 42 | | foreach (var child in jsonArray) |
| | | 43 | | { |
| | 20 | 44 | | foreach (var childId in GetActivityIds(child)) |
| | 5 | 45 | | yield return childId; |
| | | 46 | | } |
| | | 47 | | } |
| | 22 | 48 | | } |
| | | 49 | | |
| | | 50 | | private static string? ReadString(JsonObject jsonObject, string name) => |
| | 28 | 51 | | jsonObject.TryGetPropertyValue(name, out var node) && node is JsonValue value && value.TryGetValue<string>(out v |
| | | 52 | | } |