InMemoryResourceCollection.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using RackPeek.Domain.Resources;
  2. using RackPeek.Domain.Resources.Models;
  3. using RackPeek.Domain.Resources.Services;
  4. using RackPeek.Domain.Resources.SystemResources;
  5. namespace RackPeek.Domain.Persistence;
  6. public sealed class InMemoryResourceCollection(IEnumerable<Resource>? seed = null) : IResourceCollection
  7. {
  8. private readonly object _lock = new();
  9. private readonly List<Resource> _resources = seed?.ToList() ?? [];
  10. public IReadOnlyList<Hardware> HardwareResources
  11. {
  12. get
  13. {
  14. lock (_lock)
  15. return _resources.OfType<Hardware>().ToList();
  16. }
  17. }
  18. public IReadOnlyList<SystemResource> SystemResources
  19. {
  20. get
  21. {
  22. lock (_lock)
  23. return _resources.OfType<SystemResource>().ToList();
  24. }
  25. }
  26. public IReadOnlyList<Service> ServiceResources
  27. {
  28. get
  29. {
  30. lock (_lock)
  31. return _resources.OfType<Service>().ToList();
  32. }
  33. }
  34. public Task LoadAsync()
  35. => Task.CompletedTask;
  36. public Task AddAsync(Resource resource)
  37. {
  38. lock (_lock)
  39. {
  40. if (_resources.Any(r =>
  41. r.Name.Equals(resource.Name, StringComparison.OrdinalIgnoreCase)))
  42. throw new InvalidOperationException($"'{resource.Name}' already exists.");
  43. resource.Kind = GetKind(resource);
  44. _resources.Add(resource);
  45. }
  46. return Task.CompletedTask;
  47. }
  48. public Task UpdateAsync(Resource resource)
  49. {
  50. lock (_lock)
  51. {
  52. var index = _resources.FindIndex(r =>
  53. r.Name.Equals(resource.Name, StringComparison.OrdinalIgnoreCase));
  54. if (index == -1)
  55. throw new InvalidOperationException("Not found.");
  56. resource.Kind = GetKind(resource);
  57. _resources[index] = resource;
  58. }
  59. return Task.CompletedTask;
  60. }
  61. public Task DeleteAsync(string name)
  62. {
  63. lock (_lock)
  64. {
  65. _resources.RemoveAll(r =>
  66. r.Name.Equals(name, StringComparison.OrdinalIgnoreCase));
  67. }
  68. return Task.CompletedTask;
  69. }
  70. public Resource? GetByName(string name)
  71. {
  72. lock (_lock)
  73. {
  74. return _resources.FirstOrDefault(r =>
  75. r.Name.Equals(name, StringComparison.OrdinalIgnoreCase));
  76. }
  77. }
  78. private static string GetKind(Resource resource) => resource switch
  79. {
  80. Server => "Server",
  81. Switch => "Switch",
  82. Firewall => "Firewall",
  83. Router => "Router",
  84. Desktop => "Desktop",
  85. Laptop => "Laptop",
  86. AccessPoint => "AccessPoint",
  87. Ups => "Ups",
  88. SystemResource => "System",
  89. Service => "Service",
  90. _ => throw new InvalidOperationException(
  91. $"Unknown resource type: {resource.GetType().Name}")
  92. };
  93. }