LaptopHardwareReportUseCase.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using RackPeek.Domain.Persistence;
  2. namespace RackPeek.Domain.Resources.Laptops;
  3. public class LaptopHardwareReportUseCase(IResourceCollection repository) : IUseCase
  4. {
  5. public async Task<LaptopHardwareReport> ExecuteAsync()
  6. {
  7. var laptops = await repository.GetAllOfTypeAsync<Laptop>();
  8. var rows = laptops.Select(laptop =>
  9. {
  10. var totalCores = laptop.Cpus?.Sum(c => c.Cores) ?? 0;
  11. var totalThreads = laptop.Cpus?.Sum(c => c.Threads) ?? 0;
  12. var cpuSummary = laptop.Cpus == null
  13. ? "Unknown"
  14. : string.Join(", ",
  15. laptop.Cpus
  16. .GroupBy(c => c.Model)
  17. .Select(g => $"{g.Count()}× {g.Key}"));
  18. var ramGb = laptop.Ram?.Size ?? 0;
  19. var totalStorage = laptop.Drives?.Sum(d => d.Size) ?? 0;
  20. var ssdStorage = laptop.Drives?
  21. .Where(d => d.Type == "ssd")
  22. .Sum(d => d.Size) ?? 0;
  23. var hddStorage = laptop.Drives?
  24. .Where(d => d.Type == "hdd")
  25. .Sum(d => d.Size) ?? 0;
  26. var gpuSummary = laptop.Gpus == null
  27. ? "None"
  28. : string.Join(", ",
  29. laptop.Gpus
  30. .GroupBy(g => g.Model)
  31. .Select(g => $"{g.Count()}× {g.Key}"));
  32. return new LaptopHardwareRow(
  33. laptop.Name,
  34. cpuSummary,
  35. totalCores,
  36. totalThreads,
  37. ramGb,
  38. totalStorage,
  39. ssdStorage,
  40. hddStorage,
  41. gpuSummary
  42. );
  43. }).ToList();
  44. return new LaptopHardwareReport(rows);
  45. }
  46. }
  47. public record LaptopHardwareReport(
  48. IReadOnlyList<LaptopHardwareRow> Laptops
  49. );
  50. public record LaptopHardwareRow(
  51. string Name,
  52. string CpuSummary,
  53. int TotalCores,
  54. int TotalThreads,
  55. int RamGb,
  56. int TotalStorageGb,
  57. int SsdStorageGb,
  58. int HddStorageGb,
  59. string GpuSummary
  60. );