HardwareRepository.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using RackPeek.Domain.Resources.Hardware;
  2. using RackPeek.Domain.Resources.Services;
  3. using RackPeek.Domain.Resources.SystemResources;
  4. namespace RackPeek.Domain.Persistence;
  5. public class YamlHardwareRepository(IResourceCollection resources) : IHardwareRepository {
  6. public Task<int> GetCountAsync() => Task.FromResult(resources.HardwareResources.Count);
  7. public Task<Dictionary<string, int>> GetKindCountAsync() {
  8. return Task.FromResult(resources.HardwareResources
  9. .GroupBy(h => h.Kind)
  10. .ToDictionary(k => k.Key, v => v.Count()));
  11. }
  12. public Task<List<HardwareTree>> GetTreeAsync() {
  13. var hardwareTree = new List<HardwareTree>();
  14. var systemGroups = resources.SystemResources
  15. .Where(s => s.RunsOn.Count != 0)
  16. .SelectMany(
  17. s => s.RunsOn,
  18. (system, hardwareName) => new {
  19. Hardware = hardwareName.Trim(),
  20. System = system
  21. })
  22. .GroupBy(x => x.Hardware, StringComparer.OrdinalIgnoreCase)
  23. .ToDictionary(
  24. g => g.Key,
  25. g => g.Select(x => x.System).ToList(),
  26. StringComparer.OrdinalIgnoreCase);
  27. var serviceGroups = resources.ServiceResources
  28. .Where(s => s.RunsOn.Count != 0)
  29. .SelectMany(
  30. s => s.RunsOn,
  31. (service, systemName) => new {
  32. System = systemName.Trim(),
  33. Service = service
  34. })
  35. .GroupBy(x => x.System, StringComparer.OrdinalIgnoreCase)
  36. .ToDictionary(
  37. g => g.Key,
  38. g => g.Select(x => x.Service).ToList(),
  39. StringComparer.OrdinalIgnoreCase);
  40. foreach (Hardware hardware in resources.HardwareResources) {
  41. var systems = new List<SystemTree>();
  42. var hardwareKey = hardware.Name.Trim();
  43. if (systemGroups.TryGetValue(hardwareKey, out List<SystemResource>? systemResources))
  44. foreach (SystemResource system in systemResources) {
  45. var services = new List<string>();
  46. var systemKey = system.Name.Trim();
  47. if (serviceGroups.TryGetValue(systemKey, out List<Service>? serviceResources))
  48. services.AddRange(serviceResources.Select(s => s.Name));
  49. systems.Add(new SystemTree {
  50. SystemName = system.Name,
  51. Services = services
  52. });
  53. }
  54. hardwareTree.Add(new HardwareTree {
  55. Kind = hardware.Kind,
  56. HardwareName = hardware.Name,
  57. Systems = systems
  58. });
  59. }
  60. return Task.FromResult(hardwareTree);
  61. }
  62. }