using RackPeek.Domain.Helpers; using RackPeek.Domain.Resources.SystemResources; namespace RackPeek.Domain.Resources.Services.UseCases; public record ServiceDescription( string Name, string? Ip, int? Port, string? Protocol, string? Url, string? RunsOnSystemHost, string? RunsOnPhysicalHost ); public class DescribeServiceUseCase(IServiceRepository repository, ISystemRepository systemRepo) : IUseCase { public async Task ExecuteAsync(string name) { name = Normalize.ServiceName(name); ThrowIfInvalid.ResourceName(name); var service = await repository.GetByNameAsync(name); if (service is null) throw new NotFoundException($"Service '{name}' not found."); string? runsOnPhysicalHost = null; if (!string.IsNullOrEmpty(service.RunsOn)) { var systemResource = await systemRepo.GetByNameAsync(service.RunsOn); runsOnPhysicalHost = systemResource?.RunsOn; } return new ServiceDescription( service.Name, service.Network?.Ip, service.Network?.Port, service.Network?.Protocol, service.Network?.Url, service.RunsOn, runsOnPhysicalHost ); } }