AddPortUseCase.cs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. using RackPeek.Domain.Helpers;
  2. using RackPeek.Domain.Persistence;
  3. using RackPeek.Domain.Resources;
  4. using RackPeek.Domain.Resources.Servers;
  5. using RackPeek.Domain.Resources.SubResources;
  6. namespace RackPeek.Domain.UseCases.Ports;
  7. public interface IAddPortUseCase<T> : IResourceUseCase<T>
  8. where T : Resource {
  9. public Task ExecuteAsync(
  10. string name,
  11. string? type,
  12. double? speed,
  13. int? ports);
  14. }
  15. public class AddPortUseCase<T>(IResourceCollection repository) : IAddPortUseCase<T> where T : Resource {
  16. public async Task ExecuteAsync(
  17. string name,
  18. string? type,
  19. double? speed,
  20. int? ports) {
  21. // ToDo pass in properties as inputs, construct the entity in the usecase, ensure optional inputs are nullable
  22. // ToDo validate / normalize all inputs
  23. name = Normalize.HardwareName(name);
  24. ThrowIfInvalid.ResourceName(name);
  25. var nicType = Normalize.NicType(type ?? string.Empty);
  26. ThrowIfInvalid.NicType(nicType);
  27. T resource = await repository.GetByNameAsync<T>(name)
  28. ?? throw new NotFoundException($"Resource '{name}' not found.");
  29. if (resource is not IPortResource pr) throw new NotFoundException($"Resource '{name}' not found.");
  30. pr.Ports ??= new List<Port>();
  31. pr.Ports.Add(new Port {
  32. Type = nicType,
  33. Speed = speed,
  34. Count = ports
  35. });
  36. await repository.UpdateAsync(resource);
  37. }
  38. }