using RackPeek.Domain.Resources.Hardware.Models; using RackPeek.Domain.Resources.Services; using RackPeek.Domain.Resources.SystemResources; namespace RackPeek.Domain.Resources.Hardware.Desktops; public class GetDesktopSystemTreeUseCase( IHardwareRepository hardwareRepository, ISystemRepository systemRepository, IServiceRepository serviceRepository) : IUseCase { public async Task ExecuteAsync(string hardwareName) { if (string.IsNullOrWhiteSpace(hardwareName)) return null; var desktop = await hardwareRepository.GetByNameAsync(hardwareName) as Desktop; if (desktop is null) return null; return await BuildDependencyTreeAsync(desktop); } private async Task BuildDependencyTreeAsync(Desktop desktop) { var systems = await systemRepository.GetByPhysicalHostAsync(desktop.Name); var systemTrees = new List(); foreach (var system in systems) systemTrees.Add(await BuildSystemDependencyTreeAsync(system)); return new HardwareDependencyTree(desktop, systemTrees); } private async Task BuildSystemDependencyTreeAsync(SystemResource system) { var services = await serviceRepository.GetBySystemHostAsync(system.Name); return new SystemDependencyTree(system, services); } } public sealed class HardwareDependencyTree(Desktop hardware, IEnumerable systems) { public Desktop 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; }