FirewallHardwareReport.cs 1.6 KB

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