GetTotalSummaryCommand.cs 5.1 KB

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