DescribeServiceUseCase.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. using RackPeek.Domain.Helpers;
  2. using RackPeek.Domain.Persistence;
  3. using RackPeek.Domain.Resources.SystemResources;
  4. namespace RackPeek.Domain.Resources.Services.UseCases;
  5. public record ServiceDescription(
  6. string Name,
  7. string? Ip,
  8. int? Port,
  9. string? Protocol,
  10. string? Url,
  11. List<string> RunsOnSystemHost,
  12. List<string> RunsOnPhysicalHost,
  13. Dictionary<string, string> Labels
  14. );
  15. public class DescribeServiceUseCase(IResourceCollection repository) : IUseCase
  16. {
  17. public async Task<ServiceDescription> ExecuteAsync(string name)
  18. {
  19. name = Normalize.ServiceName(name);
  20. ThrowIfInvalid.ResourceName(name);
  21. var service = await repository.GetByNameAsync(name) as Service;
  22. if (service is null)
  23. throw new NotFoundException($"Service '{name}' not found.");
  24. List<string> runsOnPhysicalHost = new List<string>();
  25. foreach (var systemName in service.RunsOn)
  26. {
  27. var systemResource = await repository.GetByNameAsync(systemName) as SystemResource;
  28. if (systemResource is not null)
  29. {
  30. foreach(var physicalName in systemResource.RunsOn)
  31. {
  32. if (!runsOnPhysicalHost.Contains(physicalName))
  33. {
  34. runsOnPhysicalHost.Add(physicalName);
  35. }
  36. }
  37. }
  38. }
  39. return new ServiceDescription(
  40. service.Name,
  41. service.Network?.Ip,
  42. service.Network?.Port,
  43. service.Network?.Protocol,
  44. service.Network?.Url,
  45. service.RunsOn,
  46. runsOnPhysicalHost,
  47. service.Labels
  48. );
  49. }
  50. }