GetHardwareSystemTreeUseCase.cs 1.8 KB

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