ServiceReportUseCase.cs 1.3 KB

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