DescribeServiceUseCase.cs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  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. public async Task<ServiceDescription> ExecuteAsync(string name) {
  17. name = Normalize.ServiceName(name);
  18. ThrowIfInvalid.ResourceName(name);
  19. var service = await repository.GetByNameAsync(name) as Service;
  20. if (service is null)
  21. throw new NotFoundException($"Service '{name}' not found.");
  22. var runsOnPhysicalHost = new List<string>();
  23. foreach (var systemName in service.RunsOn) {
  24. var systemResource = await repository.GetByNameAsync(systemName) as SystemResource;
  25. if (systemResource is not null)
  26. foreach (var physicalName in systemResource.RunsOn)
  27. if (!runsOnPhysicalHost.Contains(physicalName))
  28. runsOnPhysicalHost.Add(physicalName);
  29. }
  30. return new ServiceDescription(
  31. service.Name,
  32. service.Network?.Ip,
  33. service.Network?.Port,
  34. service.Network?.Protocol,
  35. service.Network?.Url,
  36. service.RunsOn,
  37. runsOnPhysicalHost,
  38. service.Labels
  39. );
  40. }
  41. }