DesktopHardwareReport.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using RackPeek.Domain.Persistence;
  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(IResourceCollection repository) : IUseCase
  19. {
  20. public async Task<DesktopHardwareReport> ExecuteAsync()
  21. {
  22. var desktops = await repository.GetAllOfTypeAsync<Desktop>();
  23. var rows = desktops.Select(desktop =>
  24. {
  25. var totalCores = desktop.Cpus?.Sum(c => c.Cores) ?? 0;
  26. var totalThreads = desktop.Cpus?.Sum(c => c.Threads) ?? 0;
  27. var cpuSummary = desktop.Cpus == null
  28. ? "Unknown"
  29. : string.Join(", ",
  30. desktop.Cpus
  31. .GroupBy(c => c.Model)
  32. .Select(g => $"{g.Count()}× {g.Key}"));
  33. var ramGb = desktop.Ram?.Size ?? 0;
  34. var totalStorage = desktop.Drives?.Sum(d => d.Size) ?? 0;
  35. var ssdStorage = desktop.Drives?
  36. .Where(d => d.Type == "ssd")
  37. .Sum(d => d.Size) ?? 0;
  38. var hddStorage = desktop.Drives?
  39. .Where(d => d.Type == "hdd")
  40. .Sum(d => d.Size) ?? 0;
  41. var nicSummary = desktop.Nics == null
  42. ? "Unknown"
  43. : string.Join(", ",
  44. desktop.Nics
  45. .GroupBy(n => n.Speed ?? 0)
  46. .OrderBy(g => g.Key)
  47. .Select(g =>
  48. {
  49. var count = g.Sum(n => n.Ports ?? 0);
  50. return $"{count}×{g.Key}G";
  51. }));
  52. var gpuSummary = desktop.Gpus == null
  53. ? "None"
  54. : string.Join(", ",
  55. desktop.Gpus
  56. .GroupBy(g => g.Model)
  57. .Select(g => $"{g.Count()}× {g.Key}"));
  58. return new DesktopHardwareRow(
  59. desktop.Name,
  60. cpuSummary,
  61. totalCores,
  62. totalThreads,
  63. ramGb,
  64. totalStorage,
  65. ssdStorage,
  66. hddStorage,
  67. nicSummary,
  68. gpuSummary
  69. );
  70. }).ToList();
  71. return new DesktopHardwareReport(rows);
  72. }
  73. }