FirewallHardwareReport.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using RackPeek.Domain.Persistence;
  2. namespace RackPeek.Domain.Resources.Firewalls;
  3. public record FirewallHardwareReport(
  4. IReadOnlyList<FirewallHardwareRow> Firewalls
  5. );
  6. public record FirewallHardwareRow(
  7. string Name,
  8. string Model,
  9. bool Managed,
  10. bool Poe,
  11. int TotalPorts,
  12. double MaxPortSpeedGb,
  13. string PortSummary
  14. );
  15. public class FirewallHardwareReportUseCase(IResourceCollection repository) : IUseCase
  16. {
  17. public async Task<FirewallHardwareReport> ExecuteAsync()
  18. {
  19. var firewalls = await repository.GetAllOfTypeAsync<Firewall>();
  20. var rows = firewalls.Select(sw =>
  21. {
  22. var totalPorts = sw.Ports?.Sum(p => p.Count ?? 0) ?? 0;
  23. var maxSpeed = sw.Ports?
  24. .Max(p => p.Speed ?? 0) ?? 0;
  25. var portSummary = sw.Ports == null
  26. ? "Unknown"
  27. : string.Join(", ",
  28. sw.Ports
  29. .GroupBy(p => p.Speed ?? 0)
  30. .OrderBy(g => g.Key)
  31. .Select(g =>
  32. {
  33. var count = g.Sum(p => p.Count ?? 0);
  34. return $"{count}×{g.Key}G";
  35. }));
  36. return new FirewallHardwareRow(
  37. sw.Name,
  38. sw.Model ?? "Unknown",
  39. sw.Managed ?? false,
  40. sw.Poe ?? false,
  41. totalPorts,
  42. maxSpeed,
  43. portSummary
  44. );
  45. }).ToList();
  46. return new FirewallHardwareReport(rows);
  47. }
  48. }