GetTotalSummaryCommand.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using Microsoft.Extensions.DependencyInjection;
  2. using RackPeek.Domain.Resources.Hardware;
  3. using RackPeek.Domain.Resources.Services.UseCases;
  4. using RackPeek.Domain.Resources.SystemResources.UseCases;
  5. using Spectre.Console;
  6. using Spectre.Console.Cli;
  7. namespace Shared.Rcl.Commands;
  8. public class GetTotalSummaryCommand(IServiceProvider provider) : AsyncCommand
  9. {
  10. public override async Task<int> ExecuteAsync(
  11. CommandContext context,
  12. CancellationToken cancellationToken)
  13. {
  14. using var scope = provider.CreateScope();
  15. var systemUseCase =
  16. scope.ServiceProvider.GetRequiredService<GetSystemSummaryUseCase>();
  17. var serviceUseCase =
  18. scope.ServiceProvider.GetRequiredService<GetServiceSummaryUseCase>();
  19. var hardwareUseCase =
  20. scope.ServiceProvider.GetRequiredService<GetHardwareUseCaseSummary>();
  21. // Execute all summaries in parallel
  22. var systemTask = systemUseCase.ExecuteAsync();
  23. var serviceTask = serviceUseCase.ExecuteAsync();
  24. var hardwareTask = hardwareUseCase.ExecuteAsync();
  25. await Task.WhenAll(systemTask, serviceTask, hardwareTask);
  26. var systemSummary = systemTask.Result;
  27. var serviceSummary = serviceTask.Result;
  28. var hardwareSummary = hardwareTask.Result;
  29. RenderSummaryTree(systemSummary, serviceSummary, hardwareSummary);
  30. return 0;
  31. }
  32. private static void RenderSummaryTree(
  33. SystemSummary systemSummary,
  34. AllServicesSummary serviceSummary,
  35. HardwareSummary hardwareSummary)
  36. {
  37. var tree = new Tree("[bold]Breakdown[/]");
  38. var hardwareNode = tree.AddNode(
  39. $"[bold]Hardware[/] ({hardwareSummary.TotalHardware})");
  40. foreach (var (kind, count) in hardwareSummary.HardwareByKind.OrderByDescending(h => h.Value).ThenBy(h => h.Key))
  41. hardwareNode.AddNode($"{kind}: {count}");
  42. var systemsNode = tree.AddNode(
  43. $"[bold]Systems[/] ({systemSummary.TotalSystems})");
  44. if (systemSummary.SystemsByType.Count > 0)
  45. {
  46. var typesNode = systemsNode.AddNode("[bold]Types[/]");
  47. foreach (var (type, count) in systemSummary.SystemsByType.OrderByDescending(h => h.Value)
  48. .ThenBy(h => h.Key))
  49. typesNode.AddNode($"{type}: {count}");
  50. }
  51. if (systemSummary.SystemsByOs.Count > 0)
  52. {
  53. var osNode = systemsNode.AddNode("[bold]Operating Systems[/]");
  54. foreach (var (os, count) in systemSummary.SystemsByOs.OrderByDescending(h => h.Value).ThenBy(h => h.Key))
  55. osNode.AddNode($"{os}: {count}");
  56. }
  57. var servicesNode = tree.AddNode(
  58. $"[bold]Services[/] ({serviceSummary.TotalServices})");
  59. servicesNode.AddNode(
  60. $"IP Addresses: {serviceSummary.TotalIpAddresses}");
  61. AnsiConsole.Write(tree);
  62. }
  63. private static void RenderTotals(
  64. SystemSummary systemSummary,
  65. AllServicesSummary serviceSummary,
  66. HardwareSummary hardwareSummary)
  67. {
  68. var grid = new Grid()
  69. .AddColumn()
  70. .AddColumn();
  71. grid.AddRow("[bold]Systems[/]", systemSummary.TotalSystems.ToString());
  72. grid.AddRow("[bold]Services[/]", serviceSummary.TotalServices.ToString());
  73. grid.AddRow("[bold]Service IPs[/]", serviceSummary.TotalIpAddresses.ToString());
  74. grid.AddRow("[bold]Hardware[/]", hardwareSummary.TotalHardware.ToString());
  75. AnsiConsole.Write(
  76. new Panel(grid)
  77. .Header("[bold]Totals[/]")
  78. .Border(BoxBorder.Rounded));
  79. }
  80. private static void RenderSystemBreakdown(SystemSummary systemSummary)
  81. {
  82. if (systemSummary.SystemsByType.Count == 0 &&
  83. systemSummary.SystemsByOs.Count == 0)
  84. return;
  85. var table = new Table()
  86. .Border(TableBorder.Rounded)
  87. .Title("[bold]Systems Breakdown[/]")
  88. .AddColumn("Category")
  89. .AddColumn("Name")
  90. .AddColumn("Count");
  91. foreach (var (type, count) in systemSummary.SystemsByType)
  92. table.AddRow("Type", type, count.ToString());
  93. foreach (var (os, count) in systemSummary.SystemsByOs)
  94. table.AddRow("OS", os, count.ToString());
  95. AnsiConsole.Write(table);
  96. }
  97. private static void RenderHardwareBreakdown(HardwareSummary hardwareSummary)
  98. {
  99. if (hardwareSummary.HardwareByKind.Count == 0)
  100. return;
  101. var table = new Table()
  102. .Border(TableBorder.Rounded)
  103. .Title("[bold]Hardware Breakdown[/]")
  104. .AddColumn("Kind")
  105. .AddColumn("Count");
  106. foreach (var (kind, count) in hardwareSummary.HardwareByKind)
  107. table.AddRow(kind, count.ToString());
  108. AnsiConsole.Write(table);
  109. }
  110. }