GetTotalSummaryCommand.cs 5.0 KB

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