ServiceReportUseCase.cs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. using RackPeek.Domain.Resources.Hardware;
  2. using RackPeek.Domain.Resources.SystemResources;
  3. namespace RackPeek.Domain.Resources.Services.UseCases;
  4. public record ServiceReport(
  5. IReadOnlyList<ServiceReportRow> Services
  6. );
  7. public record ServiceReportRow(
  8. string Name,
  9. string? Ip,
  10. int? Port,
  11. string? Protocol,
  12. string? Url,
  13. string? RunsOnSystemHost,
  14. string? RunsOnPhysicalHost
  15. );
  16. public class ServiceReportUseCase(IServiceRepository repository, ISystemRepository systemRepo) : IUseCase
  17. {
  18. public async Task<ServiceReport> ExecuteAsync()
  19. {
  20. var services = await repository.GetAllAsync();
  21. var rows = services.Select(async s =>
  22. {
  23. string? runsOnPhysicalHost = null;
  24. if (!string.IsNullOrEmpty(s.RunsOn))
  25. {
  26. var systemResource = await systemRepo.GetByNameAsync(s.RunsOn);
  27. runsOnPhysicalHost = systemResource?.RunsOn;
  28. }
  29. return new ServiceReportRow(
  30. s.Name,
  31. s.Network?.Ip,
  32. s.Network?.Port,
  33. s.Network?.Protocol,
  34. s.Network?.Url,
  35. s.RunsOn,
  36. runsOnPhysicalHost
  37. );
  38. }).ToList();
  39. var result = await Task.WhenAll(rows);
  40. return new ServiceReport(result);
  41. }
  42. }