using RackPeek.Domain.Helpers; using RackPeek.Domain.Persistence; using RackPeek.Domain.Resources.SystemResources; namespace RackPeek.Domain.Resources.Hardware; public class GetHardwareSystemTreeUseCase( IResourceCollection repo) : IUseCase { public async Task ExecuteAsync(string hardwareName) { ThrowIfInvalid.ResourceName(hardwareName); var hardware = await repo.GetByNameAsync(hardwareName) as Hardware; if (hardware is null) throw new NotFoundException($"Hardware '{hardwareName}' not found."); return await BuildDependencyTreeAsync(hardware); } private async Task BuildDependencyTreeAsync(Hardware hardware) { IReadOnlyList systems = await repo.GetDependantsAsync(hardware.Name); var systemTrees = new List(); foreach (SystemResource system in systems.OfType()) systemTrees.Add(await BuildSystemDependencyTreeAsync(system)); return new HardwareDependencyTree(hardware, systemTrees); } private async Task BuildSystemDependencyTreeAsync(SystemResource system) { IReadOnlyList services = await repo.GetDependantsAsync(system.Name); return new SystemDependencyTree(system, services); } } public sealed class HardwareDependencyTree(Hardware hardware, IEnumerable systems) { public Hardware Hardware { get; } = hardware; public IEnumerable Systems { get; } = systems; } public sealed class SystemDependencyTree(SystemResource system, IEnumerable childResources) { public SystemResource System { get; } = system; public IEnumerable ChildResources { get; } = childResources; }