using RackPeek.Domain.Resources.Hardware; namespace RackPeek.Domain.Persistence; public class YamlHardwareRepository(IResourceCollection resources) : IHardwareRepository { public Task GetCountAsync() { return Task.FromResult(resources.HardwareResources.Count); } public Task> GetKindCountAsync() { return Task.FromResult(resources.HardwareResources .GroupBy(h => h.Kind) .ToDictionary(k => k.Key, v => v.Count())); } public Task> GetTreeAsync() { var hardwareTree = new List(); var systemGroups = resources.SystemResources .Where(s => !string.IsNullOrWhiteSpace(s.RunsOn)) .GroupBy(s => s.RunsOn!.Trim(), StringComparer.OrdinalIgnoreCase) .ToDictionary(g => g.Key, g => g.ToList(), StringComparer.OrdinalIgnoreCase); var serviceGroups = resources.ServiceResources .Where(s => !string.IsNullOrWhiteSpace(s.RunsOn)) .GroupBy(s => s.RunsOn!.Trim(), StringComparer.OrdinalIgnoreCase) .ToDictionary(g => g.Key, g => g.ToList(), StringComparer.OrdinalIgnoreCase); foreach (var hardware in resources.HardwareResources) { var systems = new List(); var hardwareKey = hardware.Name.Trim(); if (systemGroups.TryGetValue(hardwareKey, out var systemResources)) foreach (var system in systemResources) { var services = new List(); var systemKey = system.Name.Trim(); if (serviceGroups.TryGetValue(systemKey, out var serviceResources)) services.AddRange(serviceResources.Select(s => s.Name)); systems.Add(new SystemTree { SystemName = system.Name, Services = services }); } hardwareTree.Add(new HardwareTree { Kind = hardware.Kind, HardwareName = hardware.Name, Systems = systems }); } return Task.FromResult(hardwareTree); } }