using RackPeek.Domain.Helpers; using RackPeek.Domain.Persistence; using RackPeek.Domain.Resources.Services; 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) { var systems = await repo.GetDependantsAsync(hardware.Name); var systemTrees = new List(); foreach (var system in systems.OfType()) systemTrees.Add(await BuildSystemDependencyTreeAsync(system)); return new HardwareDependencyTree(hardware, systemTrees); } private async Task BuildSystemDependencyTreeAsync(SystemResource system) { var services = await repo.GetDependantsAsync(system.Name); return new SystemDependencyTree(system, services.OfType()); } } 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 services) { public SystemResource System { get; } = system; public IEnumerable Services { get; } = services; }