using RackPeek.Domain.Helpers; using RackPeek.Domain.Persistence; using RackPeek.Domain.Resources; namespace RackPeek.Domain.UseCases; public interface IGetResourceByNameUseCase : IResourceUseCase where T : Resource { public Task ExecuteAsync(string name); } public class GetResourceByNameUseCase(IResourceCollection repo) : IGetResourceByNameUseCase where T : Resource { public async Task ExecuteAsync(string name) { name = Normalize.SystemName(name); ThrowIfInvalid.ResourceName(name); if (await repo.GetByNameAsync(name) is not T resource) throw new NotFoundException($"Resource '{name}' not found."); return resource; } }