GetHardwareSystemTreeUseCase.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using RackPeek.Domain.Helpers;
  2. using RackPeek.Domain.Persistence;
  3. using RackPeek.Domain.Resources.Services;
  4. using RackPeek.Domain.Resources.SystemResources;
  5. namespace RackPeek.Domain.Resources.Hardware;
  6. public class GetHardwareSystemTreeUseCase(
  7. IResourceCollection repo) : IUseCase
  8. {
  9. public async Task<HardwareDependencyTree> ExecuteAsync(string hardwareName)
  10. {
  11. ThrowIfInvalid.ResourceName(hardwareName);
  12. var hardware = await repo.GetByNameAsync(hardwareName) as Hardware;
  13. if (hardware is null)
  14. throw new NotFoundException($"Hardware '{hardwareName}' not found.");
  15. return await BuildDependencyTreeAsync(hardware);
  16. }
  17. private async Task<HardwareDependencyTree> BuildDependencyTreeAsync(Hardware hardware)
  18. {
  19. var systems = await repo.GetDependantsAsync(hardware.Name);
  20. var systemTrees = new List<SystemDependencyTree>();
  21. foreach (var system in systems.OfType<SystemResource>())
  22. systemTrees.Add(await BuildSystemDependencyTreeAsync(system));
  23. return new HardwareDependencyTree(hardware, systemTrees);
  24. }
  25. private async Task<SystemDependencyTree> BuildSystemDependencyTreeAsync(SystemResource system)
  26. {
  27. var services = await repo.GetDependantsAsync(system.Name);
  28. return new SystemDependencyTree(system, services.OfType<Service>());
  29. }
  30. }
  31. public sealed class HardwareDependencyTree(Hardware hardware, IEnumerable<SystemDependencyTree> systems)
  32. {
  33. public Hardware Hardware { get; } = hardware;
  34. public IEnumerable<SystemDependencyTree> Systems { get; } = systems;
  35. }
  36. public sealed class SystemDependencyTree(SystemResource system, IEnumerable<Service> services)
  37. {
  38. public SystemResource System { get; } = system;
  39. public IEnumerable<Service> Services { get; } = services;
  40. }