| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- using RackPeek.Domain.Resources;
- using RackPeek.Domain.Resources.AccessPoints;
- using RackPeek.Domain.Resources.Desktops;
- using RackPeek.Domain.Resources.Firewalls;
- using RackPeek.Domain.Resources.Hardware;
- using RackPeek.Domain.Resources.Laptops;
- using RackPeek.Domain.Resources.Routers;
- using RackPeek.Domain.Resources.Servers;
- using RackPeek.Domain.Resources.Services;
- using RackPeek.Domain.Resources.Switches;
- using RackPeek.Domain.Resources.SystemResources;
- using RackPeek.Domain.Resources.UpsUnits;
- namespace RackPeek.Domain.Persistence;
- public sealed class InMemoryResourceCollection(IEnumerable<Resource>? seed = null) : IResourceCollection
- {
- private readonly object _lock = new();
- private readonly List<Resource> _resources = seed?.ToList() ?? [];
- public IReadOnlyList<Hardware> HardwareResources
- {
- get
- {
- lock (_lock)
- {
- return _resources.OfType<Hardware>().ToList();
- }
- }
- }
- public IReadOnlyList<SystemResource> SystemResources
- {
- get
- {
- lock (_lock)
- {
- return _resources.OfType<SystemResource>().ToList();
- }
- }
- }
- public IReadOnlyList<Service> ServiceResources
- {
- get
- {
- lock (_lock)
- {
- return _resources.OfType<Service>().ToList();
- }
- }
- }
- public Task<bool> Exists(string name)
- {
- lock (_lock)
- {
- return Task.FromResult(_resources.Exists(r =>
- r.Name.Equals(name, StringComparison.OrdinalIgnoreCase)));
- }
- }
- public Task<string?> GetKind(string name)
- {
- lock (_lock)
- {
- return Task.FromResult(_resources.FirstOrDefault(r =>
- r.Name.Equals(name, StringComparison.OrdinalIgnoreCase))?.Kind);
- }
-
- }
- public Task LoadAsync()
- {
- return Task.CompletedTask;
- }
- public Task<IReadOnlyList<Resource>> GetByTagAsync(string name)
- {
- lock (_lock)
- {
- return Task.FromResult<IReadOnlyList<Resource>>(_resources.Where(r => r.Tags.Contains(name)).ToList());
- }
- }
- public Task<Dictionary<string, int>> GetTagsAsync()
- {
- lock (_lock)
- {
- var result = _resources
- .SelectMany(r => r.Tags!) // flatten all tag arrays
- .Where(t => !string.IsNullOrWhiteSpace(t))
- .GroupBy(t => t)
- .ToDictionary(g => g.Key, g => g.Count());
- return Task.FromResult(result);
- }
- }
- public Task<IReadOnlyList<T>> GetAllOfTypeAsync<T>()
- {
- lock (_lock)
- {
- return Task.FromResult<IReadOnlyList<T>>(_resources.OfType<T>().ToList());
- }
- }
- public Task<IReadOnlyList<Resource>> GetDependantsAsync(string name)
- {
- lock (_lock)
- {
- return Task.FromResult<IReadOnlyList<Resource>>(_resources
- .Where(r => r.RunsOn.Select(p => p.Equals(name, StringComparison.OrdinalIgnoreCase)).ToList().Count != 0).ToList());
- }
- }
- public Task AddAsync(Resource resource)
- {
- lock (_lock)
- {
- if (_resources.Any(r =>
- r.Name.Equals(resource.Name, StringComparison.OrdinalIgnoreCase)))
- throw new InvalidOperationException($"'{resource.Name}' already exists.");
- resource.Kind = GetKind(resource);
- _resources.Add(resource);
- }
- return Task.CompletedTask;
- }
- public Task UpdateAsync(Resource resource)
- {
- lock (_lock)
- {
- var index = _resources.FindIndex(r =>
- r.Name.Equals(resource.Name, StringComparison.OrdinalIgnoreCase));
- if (index == -1)
- throw new InvalidOperationException("Not found.");
- resource.Kind = GetKind(resource);
- _resources[index] = resource;
- }
- return Task.CompletedTask;
- }
- public Task DeleteAsync(string name)
- {
- lock (_lock)
- {
- _resources.RemoveAll(r =>
- r.Name.Equals(name, StringComparison.OrdinalIgnoreCase));
- }
- return Task.CompletedTask;
- }
- public Task<Resource?> GetByNameAsync(string name)
- {
- lock (_lock)
- {
- return Task.FromResult(_resources.FirstOrDefault(r =>
- r.Name.Equals(name, StringComparison.OrdinalIgnoreCase)));
- }
- }
- public Task<T?> GetByNameAsync<T>(string name) where T : Resource
- {
- lock (_lock)
- {
- var resource = _resources.FirstOrDefault(r => r.Name.Equals(name, StringComparison.OrdinalIgnoreCase));
- return Task.FromResult<T?>(resource as T);
- }
- }
- public Resource? GetByName(string name)
- {
- lock (_lock)
- {
- return _resources.FirstOrDefault(r =>
- r.Name.Equals(name, StringComparison.OrdinalIgnoreCase));
- }
- }
- private static string GetKind(Resource resource)
- {
- return resource switch
- {
- Server => "Server",
- Switch => "Switch",
- Firewall => "Firewall",
- Router => "Router",
- Desktop => "Desktop",
- Laptop => "Laptop",
- AccessPoint => "AccessPoint",
- Ups => "Ups",
- SystemResource => "System",
- Service => "Service",
- _ => throw new InvalidOperationException(
- $"Unknown resource type: {resource.GetType().Name}")
- };
- }
- }
|