SystemRepository.cs 3.4 KB

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