DescribeServiceUseCase.cs 1.4 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. string? RunsOnSystemHost,
  12. 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. string? runsOnPhysicalHost = null;
  25. if (!string.IsNullOrEmpty(service.RunsOn))
  26. {
  27. var systemResource = await repository.GetByNameAsync(service.RunsOn) as SystemResource;
  28. runsOnPhysicalHost = systemResource?.RunsOn;
  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. }