YamlHardwareRepository.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. using RackPeek.Domain.Resources.Hardware;
  2. using RackPeek.Domain.Resources.Models;
  3. namespace RackPeek.Domain.Persistence;
  4. public class YamlHardwareRepository(IResourceCollection resources) : IHardwareRepository
  5. {
  6. public Task<int> GetCountAsync()
  7. {
  8. return Task.FromResult(resources.HardwareResources.Count);
  9. }
  10. public Task<Dictionary<string, int>> GetKindCountAsync()
  11. {
  12. return Task.FromResult(resources.HardwareResources
  13. .GroupBy(h => h.Kind)
  14. .ToDictionary(k => k.Key, v => v.Count()));
  15. }
  16. public Task<IReadOnlyList<Hardware>> GetAllAsync()
  17. {
  18. return Task.FromResult(resources.HardwareResources);
  19. }
  20. public Task<Hardware?> GetByNameAsync(string name)
  21. {
  22. return Task.FromResult(resources.GetByName(name) as Hardware);
  23. }
  24. public Task<List<HardwareTree>> GetTreeAsync()
  25. {
  26. var hardwareTree = new List<HardwareTree>();
  27. var systemGroups = resources.SystemResources
  28. .Where(s => !string.IsNullOrWhiteSpace(s.RunsOn))
  29. .GroupBy(s => s.RunsOn!.Trim(), StringComparer.OrdinalIgnoreCase)
  30. .ToDictionary(g => g.Key, g => g.ToList(), StringComparer.OrdinalIgnoreCase);
  31. var serviceGroups = resources.ServiceResources
  32. .Where(s => !string.IsNullOrWhiteSpace(s.RunsOn))
  33. .GroupBy(s => s.RunsOn!.Trim(), StringComparer.OrdinalIgnoreCase)
  34. .ToDictionary(g => g.Key, g => g.ToList(), StringComparer.OrdinalIgnoreCase);
  35. foreach (var hardware in resources.HardwareResources)
  36. {
  37. var systems = new List<SystemTree>();
  38. var hardwareKey = hardware.Name.Trim();
  39. if (systemGroups.TryGetValue(hardwareKey, out var systemResources))
  40. foreach (var system in systemResources)
  41. {
  42. var services = new List<string>();
  43. var systemKey = system.Name.Trim();
  44. if (serviceGroups.TryGetValue(systemKey, out var serviceResources))
  45. services.AddRange(serviceResources.Select(s => s.Name));
  46. systems.Add(new SystemTree
  47. {
  48. SystemName = system.Name,
  49. Services = services
  50. });
  51. }
  52. hardwareTree.Add(new HardwareTree
  53. {
  54. Kind = hardware.Kind,
  55. HardwareName = hardware.Name,
  56. Systems = systems
  57. });
  58. }
  59. return Task.FromResult(hardwareTree);
  60. }
  61. public async Task AddAsync(Hardware hardware)
  62. {
  63. if (resources.HardwareResources.Any(r =>
  64. r.Name.Equals(hardware.Name, StringComparison.OrdinalIgnoreCase)))
  65. throw new InvalidOperationException(
  66. $"Hardware with name '{hardware.Name}' already exists.");
  67. await resources.AddAsync(hardware);
  68. }
  69. public async Task UpdateAsync(Hardware hardware)
  70. {
  71. var existing = resources.HardwareResources
  72. .FirstOrDefault(r => r.Name.Equals(hardware.Name, StringComparison.OrdinalIgnoreCase));
  73. if (existing == null)
  74. throw new InvalidOperationException($"Hardware '{hardware.Name}' not found.");
  75. await resources.UpdateAsync(hardware);
  76. }
  77. public async Task DeleteAsync(string name)
  78. {
  79. var existing = resources.HardwareResources
  80. .FirstOrDefault(r => r.Name.Equals(name, StringComparison.OrdinalIgnoreCase));
  81. if (existing == null)
  82. throw new InvalidOperationException($"Hardware '{name}' not found.");
  83. await resources.DeleteAsync(name);
  84. }
  85. }