LaptopHardwareReportUseCase.cs 2.1 KB

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