ServiceReportUseCase.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. using RackPeek.Domain.Persistence;
  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. List<string>? RunsOnSystemHost,
  13. List<string>? RunsOnPhysicalHost
  14. );
  15. public class ServiceReportUseCase(IResourceCollection repository) : IUseCase {
  16. public async Task<ServiceReport> ExecuteAsync() {
  17. IReadOnlyList<Service> services = await repository.GetAllOfTypeAsync<Service>();
  18. var rows = services.Select(async s => {
  19. var runsOnPhysicalHost = new List<string>();
  20. if (s.RunsOn is not null)
  21. foreach (var system in s.RunsOn) {
  22. Resource? systemResource = await repository.GetByNameAsync(system);
  23. if (systemResource?.RunsOn is not null)
  24. foreach (var parent in systemResource.RunsOn)
  25. if (!runsOnPhysicalHost.Contains(parent))
  26. runsOnPhysicalHost.Add(parent);
  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. ServiceReportRow[] result = await Task.WhenAll(rows);
  39. return new ServiceReport(result);
  40. }
  41. }