using RackPeek.Domain.Helpers; using RackPeek.Domain.Persistence; using RackPeek.Domain.Resources; namespace RackPeek.Domain.UseCases; public interface IRenameResourceUseCase : IResourceUseCase where T : Resource { public Task ExecuteAsync(string originalName, string newName); } public class RenameResourceUseCase(IResourceCollection repo) : IRenameResourceUseCase where T : Resource { public async Task ExecuteAsync(string originalName, string newName) { originalName = Normalize.SystemName(originalName); ThrowIfInvalid.ResourceName(originalName); newName = Normalize.SystemName(newName); ThrowIfInvalid.ResourceName(newName); Resource? existingResource = await repo.GetByNameAsync(newName); if (existingResource != null) throw new ConflictException($"{existingResource.Kind} resource '{newName}' already exists."); Resource? original = await repo.GetByNameAsync(originalName); if (original == null) throw new NotFoundException($"Resource '{originalName}' not found."); original.Name = newName; await repo.UpdateAsync(original); IReadOnlyList children = await repo.GetDependantsAsync(originalName); foreach (Resource child in children) { child.RunsOn = child.RunsOn.ConvertAll(p => p == originalName ? newName : p); await repo.UpdateAsync(child); } } }