ソースを参照

Command and usecase added

James 2 ヶ月 前
コミット
4c5a9eb0f7

+ 52 - 0
RackPeek.Domain/Resources/Hardware/Desktops/GetDesktopSystemTreeUseCase.cs

@@ -0,0 +1,52 @@
+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<HardwareDependencyTree?> 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<HardwareDependencyTree> BuildDependencyTreeAsync(Desktop desktop)
+    {
+        var systems = await systemRepository.GetByPhysicalHostAsync(desktop.Name);
+
+        var systemTrees = new List<SystemDependencyTree>();
+        foreach (var system in systems)
+            systemTrees.Add(await BuildSystemDependencyTreeAsync(system));
+
+        return new HardwareDependencyTree(desktop, systemTrees);
+    }
+
+    private async Task<SystemDependencyTree> BuildSystemDependencyTreeAsync(SystemResource system)
+    {
+        var services = await serviceRepository.GetBySystemHostAsync(system.Name);
+        return new SystemDependencyTree(system, services);
+    }
+}
+
+public sealed class HardwareDependencyTree(Desktop hardware, IEnumerable<SystemDependencyTree> systems)
+{
+    public Desktop Hardware { get; } = hardware;
+    public IEnumerable<SystemDependencyTree> Systems { get; } = systems;
+}
+
+public sealed class SystemDependencyTree(SystemResource system, IEnumerable<Service> services)
+{
+    public SystemResource System { get; } = system;
+    public IEnumerable<Service> Services { get; } = services;
+}

+ 2 - 0
RackPeek/CliBootstrap.cs

@@ -271,6 +271,8 @@ public static class CliBootstrap
                     desktops.AddCommand<DesktopDeleteCommand>("del");
                     desktops.AddCommand<DesktopReportCommand>("summary")
                         .WithDescription("Show desktop hardware report");
+                    desktops.AddCommand<DesktopTreeCommand>("tree");
+
 
                     // CPU
                     desktops.AddBranch("cpu", cpu =>

+ 35 - 0
RackPeek/Commands/Desktops/DesktopTreeCommand.cs

@@ -0,0 +1,35 @@
+using RackPeek.Domain.Resources.Hardware.Desktops;
+using Spectre.Console;
+using Spectre.Console.Cli;
+
+namespace RackPeek.Commands.Desktops;
+
+public sealed class DesktopTreeCommand(GetDesktopSystemTreeUseCase useCase)
+    : AsyncCommand<DesktopNameSettings>
+{
+    public override async Task<int> ExecuteAsync(
+        CommandContext context,
+        DesktopNameSettings settings,
+        CancellationToken cancellationToken)
+    {
+        var tree = await useCase.ExecuteAsync(settings.Name);
+
+        if (tree is null)
+        {
+            AnsiConsole.MarkupLine($"[red]Error:[/] Desktop '{settings.Name}' not found.");
+            return -1;
+        }
+
+        var root = new Tree($"[bold]{tree.Hardware.Name}[/]");
+
+        foreach (var system in tree.Systems)
+        {
+            var systemNode = root.AddNode($"[green]System:[/] {system.System.Name}");
+            foreach (var service in system.Services)
+                systemNode.AddNode($"[green]Service:[/] {service.Name}");
+        }
+
+        AnsiConsole.Write(root);
+        return 0;
+    }
+}