HardwareRepository.cs 2.9 KB

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