YamlSystemRepository.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using RackPeek.Domain.Resources.SystemResources;
  2. namespace RackPeek.Yaml;
  3. public class YamlSystemRepository(YamlResourceCollection resources) : ISystemRepository
  4. {
  5. public Task<IReadOnlyList<SystemResource>> GetAllAsync()
  6. {
  7. return Task.FromResult(resources.SystemResources);
  8. }
  9. public Task<SystemResource?> GetByNameAsync(string name)
  10. {
  11. return Task.FromResult(resources.GetByName(name) as SystemResource);
  12. }
  13. public Task AddAsync(SystemResource systemResource)
  14. {
  15. if (resources.SystemResources.Any(r =>
  16. r.Name.Equals(systemResource.Name, StringComparison.OrdinalIgnoreCase)))
  17. throw new InvalidOperationException(
  18. $"System with name '{systemResource.Name}' already exists.");
  19. // Use first file as default for new resources
  20. var targetFile = resources.SourceFiles.FirstOrDefault()
  21. ?? throw new InvalidOperationException("No YAML file loaded.");
  22. resources.Add(systemResource, targetFile);
  23. resources.SaveAll();
  24. return Task.CompletedTask;
  25. }
  26. public Task UpdateAsync(SystemResource systemResource)
  27. {
  28. var existing = resources.SystemResources
  29. .FirstOrDefault(r => r.Name.Equals(systemResource.Name, StringComparison.OrdinalIgnoreCase));
  30. if (existing == null)
  31. throw new InvalidOperationException($"System '{systemResource.Name}' not found.");
  32. resources.Update(systemResource);
  33. resources.SaveAll();
  34. return Task.CompletedTask;
  35. }
  36. public Task DeleteAsync(string name)
  37. {
  38. var existing = resources.SystemResources
  39. .FirstOrDefault(r => r.Name.Equals(name, StringComparison.OrdinalIgnoreCase));
  40. if (existing == null)
  41. throw new InvalidOperationException($"System '{name}' not found.");
  42. resources.Delete(name);
  43. resources.SaveAll();
  44. return Task.CompletedTask;
  45. }
  46. }