YamlSystemRepository.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. using RackPeek.Domain.Resources.SystemResources;
  2. namespace RackPeek.Domain.Persistence;
  3. public class YamlSystemRepository(IResourceCollection resources) : ISystemRepository
  4. {
  5. public Task<int> GetSystemCountAsync()
  6. {
  7. return Task.FromResult(resources.SystemResources.Count);
  8. }
  9. public Task<Dictionary<string, int>> GetSystemTypeCountAsync()
  10. {
  11. return Task.FromResult(resources.SystemResources
  12. .Where(s => !string.IsNullOrEmpty(s.Type))
  13. .GroupBy(h => h.Type!)
  14. .ToDictionary(k => k.Key, v => v.Count()));
  15. }
  16. public Task<Dictionary<string, int>> GetSystemOsCountAsync()
  17. {
  18. return Task.FromResult(resources.SystemResources
  19. .Where(s => !string.IsNullOrEmpty(s.Os))
  20. .GroupBy(h => h.Os!)
  21. .ToDictionary(k => k.Key, v => v.Count()));
  22. }
  23. public Task<IReadOnlyList<SystemResource>> GetAllAsync()
  24. {
  25. return Task.FromResult(resources.SystemResources);
  26. }
  27. public Task<IReadOnlyList<SystemResource>> GetFilteredAsync(
  28. string? typeFilter,
  29. string? osFilter)
  30. {
  31. var query = resources.SystemResources.AsQueryable();
  32. var type = Normalize(typeFilter);
  33. var os = Normalize(osFilter);
  34. if (type != null)
  35. query = query.Where(x => x.Type != null && x.Type.Equals(type, StringComparison.CurrentCultureIgnoreCase));
  36. if (os != null)
  37. query = query.Where(x => x.Os != null && x.Os.Equals(os, StringComparison.CurrentCultureIgnoreCase));
  38. var results = query.ToList();
  39. return Task.FromResult<IReadOnlyList<SystemResource>>(results);
  40. }
  41. private static string? Normalize(string? value)
  42. {
  43. return string.IsNullOrWhiteSpace(value) ? null : value.Trim().ToLower();
  44. }
  45. public Task<SystemResource?> GetByNameAsync(string name)
  46. {
  47. return Task.FromResult(resources.GetByName(name) as SystemResource);
  48. }
  49. public Task<IReadOnlyList<SystemResource>> GetByPhysicalHostAsync(string physicalHostName)
  50. {
  51. var physicalHostNameLower = physicalHostName.ToLower().Trim();
  52. var results = resources.SystemResources
  53. .Where(s => s.RunsOn != null && s.RunsOn.ToLower().Equals(physicalHostNameLower)).ToList();
  54. return Task.FromResult<IReadOnlyList<SystemResource>>(results);
  55. }
  56. public async Task AddAsync(SystemResource systemResource)
  57. {
  58. if (resources.SystemResources.Any(r =>
  59. r.Name.Equals(systemResource.Name, StringComparison.OrdinalIgnoreCase)))
  60. throw new InvalidOperationException(
  61. $"System with name '{systemResource.Name}' already exists.");
  62. await resources.AddAsync(systemResource);
  63. }
  64. public async Task UpdateAsync(SystemResource systemResource)
  65. {
  66. var existing = resources.SystemResources
  67. .FirstOrDefault(r => r.Name.Equals(systemResource.Name, StringComparison.OrdinalIgnoreCase));
  68. if (existing == null)
  69. throw new InvalidOperationException($"System '{systemResource.Name}' not found.");
  70. await resources.UpdateAsync(systemResource);
  71. }
  72. public async Task DeleteAsync(string name)
  73. {
  74. var existing = resources.SystemResources
  75. .FirstOrDefault(r => r.Name.Equals(name, StringComparison.OrdinalIgnoreCase));
  76. if (existing == null)
  77. throw new InvalidOperationException($"System '{name}' not found.");
  78. await resources.DeleteAsync(name);
  79. }
  80. }