LaptopHardwareReportUseCase.cs 2.0 KB

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