DesktopHardwareReport.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using RackPeek.Domain.Resources.Models;
  2. namespace RackPeek.Domain.Resources.Hardware.Desktops;
  3. public record DesktopHardwareReport(
  4. IReadOnlyList<DesktopHardwareRow> Desktops
  5. );
  6. public record DesktopHardwareRow(
  7. string Name,
  8. string CpuSummary,
  9. int TotalCores,
  10. int TotalThreads,
  11. int RamGb,
  12. int TotalStorageGb,
  13. int SsdStorageGb,
  14. int HddStorageGb,
  15. string NicSummary,
  16. string GpuSummary
  17. );
  18. public class DesktopHardwareReportUseCase(IHardwareRepository repository) : IUseCase
  19. {
  20. public async Task<DesktopHardwareReport> ExecuteAsync()
  21. {
  22. var hardware = await repository.GetAllAsync();
  23. var desktops = hardware.OfType<Desktop>();
  24. var rows = desktops.Select(desktop =>
  25. {
  26. var totalCores = desktop.Cpus?.Sum(c => c.Cores) ?? 0;
  27. var totalThreads = desktop.Cpus?.Sum(c => c.Threads) ?? 0;
  28. var cpuSummary = desktop.Cpus == null
  29. ? "Unknown"
  30. : string.Join(", ",
  31. desktop.Cpus
  32. .GroupBy(c => c.Model)
  33. .Select(g => $"{g.Count()}× {g.Key}"));
  34. var ramGb = desktop.Ram?.Size ?? 0;
  35. var totalStorage = desktop.Drives?.Sum(d => d.Size) ?? 0;
  36. var ssdStorage = desktop.Drives?
  37. .Where(d => d.Type == "ssd")
  38. .Sum(d => d.Size) ?? 0;
  39. var hddStorage = desktop.Drives?
  40. .Where(d => d.Type == "hdd")
  41. .Sum(d => d.Size) ?? 0;
  42. var nicSummary = desktop.Nics == null
  43. ? "Unknown"
  44. : string.Join(", ",
  45. desktop.Nics
  46. .GroupBy(n => n.Speed ?? 0)
  47. .OrderBy(g => g.Key)
  48. .Select(g =>
  49. {
  50. var count = g.Sum(n => n.Ports ?? 0);
  51. return $"{count}×{g.Key}G";
  52. }));
  53. var gpuSummary = desktop.Gpus == null
  54. ? "None"
  55. : string.Join(", ",
  56. desktop.Gpus
  57. .GroupBy(g => g.Model)
  58. .Select(g => $"{g.Count()}× {g.Key}"));
  59. return new DesktopHardwareRow(
  60. desktop.Name,
  61. cpuSummary,
  62. totalCores,
  63. totalThreads,
  64. ramGb,
  65. totalStorage,
  66. ssdStorage,
  67. hddStorage,
  68. nicSummary,
  69. gpuSummary
  70. );
  71. }).ToList();
  72. return new DesktopHardwareReport(rows);
  73. }
  74. }