RenameResourceUseCase.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using RackPeek.Domain.Helpers;
  2. using RackPeek.Domain.Persistence;
  3. using RackPeek.Domain.Resources;
  4. using RackPeek.Domain.Resources.Connections;
  5. namespace RackPeek.Domain.UseCases;
  6. public interface IRenameResourceUseCase<T> : IResourceUseCase<T>
  7. where T : Resource {
  8. Task ExecuteAsync(string originalName, string newName);
  9. }
  10. public class RenameResourceUseCase<T>(IResourceCollection repo) : IRenameResourceUseCase<T> where T : Resource {
  11. public async Task ExecuteAsync(string originalName, string newName) {
  12. originalName = Normalize.HardwareName(originalName);
  13. ThrowIfInvalid.ResourceName(originalName);
  14. newName = Normalize.HardwareName(newName);
  15. ThrowIfInvalid.ResourceName(newName);
  16. Resource? existingResource = await repo.GetByNameAsync(newName);
  17. if (existingResource != null)
  18. throw new ConflictException($"{existingResource.Kind} resource '{newName}' already exists.");
  19. Resource? original = await repo.GetByNameAsync(originalName);
  20. if (original == null)
  21. throw new NotFoundException($"Resource '{originalName}' not found.");
  22. original.Name = newName;
  23. await repo.UpdateAsync(original);
  24. IReadOnlyList<Resource> allResources = await repo.GetAllOfTypeAsync<Resource>();
  25. foreach (Resource resource in allResources) {
  26. if (resource.RunsOn.Contains(originalName)) {
  27. resource.RunsOn = resource.RunsOn
  28. .ConvertAll(p => p == originalName ? newName : p);
  29. await repo.UpdateAsync(resource);
  30. }
  31. }
  32. IReadOnlyList<Connection> connections = await repo.GetConnectionsAsync();
  33. foreach (Connection connection in connections) {
  34. var updated = false;
  35. if (connection.A.Resource == originalName) {
  36. connection.A.Resource = newName;
  37. updated = true;
  38. }
  39. if (connection.B.Resource == originalName) {
  40. connection.B.Resource = newName;
  41. updated = true;
  42. }
  43. if (updated) {
  44. await repo.RemoveConnectionAsync(connection);
  45. await repo.AddConnectionAsync(connection);
  46. }
  47. }
  48. }
  49. }