DesktopHardwareReport.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using RackPeek.Domain.Persistence;
  2. using RackPeek.Domain.Resources.Models;
  3. namespace RackPeek.Domain.Resources.Hardware.Desktops;
  4. public record DesktopHardwareReport(
  5. IReadOnlyList<DesktopHardwareRow> Desktops
  6. );
  7. public record DesktopHardwareRow(
  8. string Name,
  9. string CpuSummary,
  10. int TotalCores,
  11. int TotalThreads,
  12. int RamGb,
  13. int TotalStorageGb,
  14. int SsdStorageGb,
  15. int HddStorageGb,
  16. string NicSummary,
  17. string GpuSummary
  18. );
  19. public class DesktopHardwareReportUseCase(IResourceCollection repository) : IUseCase
  20. {
  21. public async Task<DesktopHardwareReport> ExecuteAsync()
  22. {
  23. var desktops = await repository.GetAllOfTypeAsync<Models.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. }