using MxGateway.Contracts.Proto.Galaxy; using MxGateway.Server.Galaxy; namespace MxGateway.Server.Grpc; /// /// Maps + rows produced /// by into galaxy_repository.v1 proto messages. /// Pure function, separated so it can be unit-tested without a SQL connection. /// public static class GalaxyProtoMapper { /// Maps Galaxy hierarchy and attribute rows to Galaxy object protos. /// Hierarchy rows from Galaxy Repository. /// Attribute rows from Galaxy Repository. public static IEnumerable MapHierarchy( IReadOnlyList hierarchy, IReadOnlyList attributes) { Dictionary> attributesByGobjectId = attributes .GroupBy(a => a.GobjectId) .ToDictionary(g => g.Key, g => g.ToList()); foreach (GalaxyHierarchyRow row in hierarchy) { yield return MapObject(row, attributesByGobjectId); } } /// Maps a Galaxy hierarchy row to a Galaxy object proto. /// Hierarchy row from Galaxy Repository. /// Attributes indexed by gobject ID. public static GalaxyObject MapObject( GalaxyHierarchyRow row, IReadOnlyDictionary> attributesByGobjectId) { GalaxyObject obj = new() { GobjectId = row.GobjectId, TagName = row.TagName, ContainedName = row.ContainedName, BrowseName = row.BrowseName, ParentGobjectId = row.ParentGobjectId, IsArea = row.IsArea, CategoryId = row.CategoryId, HostedByGobjectId = row.HostedByGobjectId, }; obj.TemplateChain.AddRange(row.TemplateChain); if (attributesByGobjectId.TryGetValue(row.GobjectId, out List? attrs)) { foreach (GalaxyAttributeRow attr in attrs) { obj.Attributes.Add(MapAttribute(attr)); } } return obj; } /// Maps a Galaxy attribute row to a Galaxy attribute proto. /// Attribute row from Galaxy Repository. public static GalaxyAttribute MapAttribute(GalaxyAttributeRow row) => new() { AttributeName = row.AttributeName, FullTagReference = row.FullTagReference, MxDataType = row.MxDataType, DataTypeName = row.DataTypeName ?? string.Empty, IsArray = row.IsArray, ArrayDimension = row.ArrayDimension ?? 0, ArrayDimensionPresent = row.ArrayDimension.HasValue, MxAttributeCategory = row.MxAttributeCategory, SecurityClassification = row.SecurityClassification, IsHistorized = row.IsHistorized, IsAlarm = row.IsAlarm, }; }