ServiceReportUseCase.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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. {
  17. public async Task<ServiceReport> ExecuteAsync()
  18. {
  19. var services = await repository.GetAllOfTypeAsync<Service>();
  20. var rows = services.Select(async s =>
  21. {
  22. List<string> runsOnPhysicalHost = new List<string>();
  23. if (s.RunsOn is not null)
  24. {
  25. foreach (var system in s.RunsOn)
  26. {
  27. var systemResource = await repository.GetByNameAsync(system);
  28. if (systemResource?.RunsOn is not null)
  29. {
  30. foreach (var parent in systemResource.RunsOn)
  31. {
  32. if (!runsOnPhysicalHost.Contains(parent)) runsOnPhysicalHost.Add(parent);
  33. }
  34. }
  35. }
  36. }
  37. return new ServiceReportRow(
  38. s.Name,
  39. s.Network?.Ip,
  40. s.Network?.Port,
  41. s.Network?.Protocol,
  42. s.Network?.Url,
  43. s.RunsOn,
  44. runsOnPhysicalHost
  45. );
  46. }).ToList();
  47. var result = await Task.WhenAll(rows);
  48. return new ServiceReport(result);
  49. }
  50. }