فهرست منبع

Usecases throw notfound exceptions instead of returning null

Tim Jones 2 ماه پیش
والد
کامیت
d810e9fd3c
78فایلهای تغییر یافته به همراه172 افزوده شده و 264 حذف شده
  1. BIN
      .DS_Store
  2. 2 2
      RackPeek.Domain/Resources/Hardware/AccessPoints/DescribeAccessPointUseCase.cs
  3. 7 2
      RackPeek.Domain/Resources/Hardware/AccessPoints/GetAccessPointUseCase.cs
  4. 2 2
      RackPeek.Domain/Resources/Hardware/Desktops/Cpus/RemoveDesktopCpuUseCase.cs
  5. 2 2
      RackPeek.Domain/Resources/Hardware/Desktops/Cpus/UpdateDesktopCpuUseCase.cs
  6. 2 2
      RackPeek.Domain/Resources/Hardware/Desktops/DescribeDesktopUseCase.cs
  7. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/Drives/AddDesktopDriveUseCase.cs
  8. 2 2
      RackPeek.Domain/Resources/Hardware/Desktops/Drives/RemoveDesktopDriveUseCase.cs
  9. 2 2
      RackPeek.Domain/Resources/Hardware/Desktops/Drives/UpdateDesktopDriveUseCase.cs
  10. 7 2
      RackPeek.Domain/Resources/Hardware/Desktops/GetDesktopUseCase.cs
  11. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/Gpus/AddDesktopGpuUseCase.cs
  12. 2 2
      RackPeek.Domain/Resources/Hardware/Desktops/Gpus/RemoveDesktopGpuUseCase.cs
  13. 2 2
      RackPeek.Domain/Resources/Hardware/Desktops/Gpus/UpdateDesktopGpuUseCase.cs
  14. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/Nics/AddDesktopNicUseCase.cs
  15. 2 2
      RackPeek.Domain/Resources/Hardware/Desktops/Nics/RemoveDesktopNicUseCase.cs
  16. 2 2
      RackPeek.Domain/Resources/Hardware/Desktops/Nics/UpdateDesktopNicUseCase.cs
  17. 3 3
      RackPeek.Domain/Resources/Hardware/Firewalls/DescribeFirewallUseCase.cs
  18. 7 2
      RackPeek.Domain/Resources/Hardware/Firewalls/GetFirewallUseCase.cs
  19. 3 2
      RackPeek.Domain/Resources/Hardware/GetHardwareSystemTreeUseCase.cs
  20. 2 2
      RackPeek.Domain/Resources/Hardware/Laptops/Cpus/UpdateDesktopCpuUseCase.cs
  21. 2 2
      RackPeek.Domain/Resources/Hardware/Laptops/DescribeLaptopUseCase.cs
  22. 1 1
      RackPeek.Domain/Resources/Hardware/Laptops/Drives/AddDesktopDriveUseCase.cs
  23. 2 2
      RackPeek.Domain/Resources/Hardware/Laptops/Drives/RemoveDesktopDriveUseCase.cs
  24. 2 2
      RackPeek.Domain/Resources/Hardware/Laptops/Drives/UpdateDesktopDriveUseCase.cs
  25. 7 2
      RackPeek.Domain/Resources/Hardware/Laptops/GetDesktopUseCase.cs
  26. 2 2
      RackPeek.Domain/Resources/Hardware/Laptops/Gpus/RemoveDesktopGpuUseCase.cs
  27. 2 2
      RackPeek.Domain/Resources/Hardware/Laptops/Gpus/UpdateDesktopGpuUseCase.cs
  28. 2 2
      RackPeek.Domain/Resources/Hardware/Routers/DescribeRouterUseCase.cs
  29. 7 2
      RackPeek.Domain/Resources/Hardware/Routers/GetRouterUseCase.cs
  30. 2 2
      RackPeek.Domain/Resources/Hardware/Servers/DescribeServerUseCase.cs
  31. 7 2
      RackPeek.Domain/Resources/Hardware/Servers/GetServerUseCase.cs
  32. 3 3
      RackPeek.Domain/Resources/Hardware/Switches/DescribeSwitchUseCase.cs
  33. 7 2
      RackPeek.Domain/Resources/Hardware/Switches/GetSwitchUseCase.cs
  34. 2 2
      RackPeek.Domain/Resources/Hardware/UpsUnits/DescribeUpsUseCase.cs
  35. 6 2
      RackPeek.Domain/Resources/Hardware/UpsUnits/GetUpsUnitUseCase.cs
  36. 2 2
      RackPeek.Domain/Resources/Services/UseCases/DescribeServiceUseCase.cs
  37. 9 2
      RackPeek.Domain/Resources/Services/UseCases/GetServiceUseCase.cs
  38. 2 2
      RackPeek.Domain/Resources/SystemResources/UseCases/DescribeSystemUseCase.cs
  39. 5 3
      RackPeek.Domain/Resources/SystemResources/UseCases/GetSystemServiceTreeUseCase.cs
  40. 9 2
      RackPeek.Domain/Resources/SystemResources/UseCases/GetSystemUseCase.cs
  41. 1 7
      RackPeek/Commands/AccessPoints/AccessPointDescribeCommand.cs
  42. 0 6
      RackPeek/Commands/AccessPoints/AccessPointGetByNameCommand.cs
  43. 1 7
      RackPeek/Commands/Desktops/DesktopDescribeCommand.cs
  44. 0 6
      RackPeek/Commands/Desktops/DesktopGetByNameCommand.cs
  45. 0 6
      RackPeek/Commands/Desktops/DesktopTreeCommand.cs
  46. 0 6
      RackPeek/Commands/Firewalls/FirewallDescribeCommand.cs
  47. 0 6
      RackPeek/Commands/Firewalls/FirewallGetByNameCommand.cs
  48. 1 1
      RackPeek/Commands/Firewalls/FirewallGetCommand.cs
  49. 1 1
      RackPeek/Commands/Firewalls/FirewallSetCommand.cs
  50. 0 6
      RackPeek/Commands/Laptops/LaptopDescribeCommand.cs
  51. 2 8
      RackPeek/Commands/Laptops/LaptopGetByNameCommand.cs
  52. 3 3
      RackPeek/Commands/Laptops/LaptopGetCommand.cs
  53. 0 6
      RackPeek/Commands/Laptops/LaptopTreeCommand.cs
  54. 0 6
      RackPeek/Commands/Routers/RouterDescribeCommand.cs
  55. 1 7
      RackPeek/Commands/Routers/RouterGetByNameCommand.cs
  56. 1 1
      RackPeek/Commands/Routers/RouterGetCommand.cs
  57. 1 1
      RackPeek/Commands/Routers/RouterReportCommand.cs
  58. 0 6
      RackPeek/Commands/Servers/ServerDescribeCommand.cs
  59. 0 6
      RackPeek/Commands/Servers/ServerGetByNameCommand.cs
  60. 0 6
      RackPeek/Commands/Services/ServiceDescribeCommand.cs
  61. 3 9
      RackPeek/Commands/Services/ServiceGetByNameCommand.cs
  62. 0 6
      RackPeek/Commands/Switches/SwitchDescribeCommand.cs
  63. 1 7
      RackPeek/Commands/Switches/SwitchGetByNameCommand.cs
  64. 0 6
      RackPeek/Commands/Systems/SystemDescribeCommand.cs
  65. 0 7
      RackPeek/Commands/Systems/SystemGetByNameCommand.cs
  66. 1 7
      RackPeek/Commands/Systems/SystemTreeCommand.cs
  67. 0 6
      RackPeek/Commands/Ups/UpsDescribeCommand.cs
  68. 1 7
      RackPeek/Commands/Ups/UpsGetByNameCommand.cs
  69. 2 4
      Tests/HardwareResources/AccessPoints/DescribeAccessPointUseCaseTests.cs
  70. 2 3
      Tests/HardwareResources/AccessPoints/GetAccessPointUseCaseTests.cs
  71. 2 3
      Tests/HardwareResources/DescribeServerUseCaseTests.cs
  72. 2 2
      Tests/HardwareResources/Desktops/DescribeDesktopUseCaseTests.cs
  73. 2 2
      Tests/HardwareResources/Desktops/GetDesktopUseCaseTests.cs
  74. 3 6
      Tests/HardwareResources/GetServerUseCaseTests.cs
  75. 2 3
      Tests/HardwareResources/Switches/DescribeSwitchUseCaseTests.cs
  76. 2 3
      Tests/HardwareResources/Switches/GetSwitchUseCaseTests.cs
  77. 2 2
      Tests/HardwareResources/Ups/DescribeUpsUseCaseTests.cs
  78. 2 2
      Tests/HardwareResources/Ups/GetUpsUnitUseCaseTests.cs

BIN
.DS_Store


+ 2 - 2
RackPeek.Domain/Resources/Hardware/AccessPoints/DescribeAccessPointUseCase.cs

@@ -11,13 +11,13 @@ public record AccessPointDescription(
 
 public class DescribeAccessPointUseCase(IHardwareRepository repository) : IUseCase
 {
-    public async Task<AccessPointDescription?> ExecuteAsync(string name)
+    public async Task<AccessPointDescription> ExecuteAsync(string name)
     {
         name = Normalize.HardwareName(name);
         ThrowIfInvalid.ResourceName(name);
         var ap = await repository.GetByNameAsync(name) as AccessPoint;
         if (ap == null)
-            return null;
+            throw new NotFoundException($"Access point '{name}' not found.");
 
         return new AccessPointDescription(
             ap.Name,

+ 7 - 2
RackPeek.Domain/Resources/Hardware/AccessPoints/GetAccessPointUseCase.cs

@@ -5,11 +5,16 @@ namespace RackPeek.Domain.Resources.Hardware.AccessPoints;
 
 public class GetAccessPointUseCase(IHardwareRepository repository) : IUseCase
 {
-    public async Task<AccessPoint?> ExecuteAsync(string name)
+    public async Task<AccessPoint> ExecuteAsync(string name)
     {
         name = Normalize.HardwareName(name);
         ThrowIfInvalid.ResourceName(name);
         var hardware = await repository.GetByNameAsync(name);
-        return hardware as AccessPoint;
+        if (hardware is not AccessPoint ap)
+        {
+            throw new NotFoundException($"Access point '{name}' not found.");
+        }
+
+        return ap;
     }
 }

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Desktops/Cpus/RemoveDesktopCpuUseCase.cs

@@ -11,10 +11,10 @@ public class RemoveDesktopCpuUseCase(IHardwareRepository repository) : IUseCase
         ThrowIfInvalid.ResourceName(name);
 
         var desktop = await repository.GetByNameAsync(name) as Desktop
-                      ?? throw new InvalidOperationException($"Desktop '{name}' not found.");
+                      ?? throw new NotFoundException($"Desktop '{name}' not found.");
 
         if (desktop.Cpus == null || index < 0 || index >= desktop.Cpus.Count)
-            throw new InvalidOperationException($"CPU index {index} not found on desktop '{name}'.");
+            throw new NotFoundException($"CPU index {index} not found on desktop '{name}'.");
 
         desktop.Cpus.RemoveAt(index);
 

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Desktops/Cpus/UpdateDesktopCpuUseCase.cs

@@ -11,10 +11,10 @@ public class UpdateDesktopCpuUseCase(IHardwareRepository repository) : IUseCase
         ThrowIfInvalid.ResourceName(name);
 
         var desktop = await repository.GetByNameAsync(name) as Desktop
-                      ?? throw new InvalidOperationException($"Desktop '{name}' not found.");
+                      ?? throw new NotFoundException($"Desktop '{name}' not found.");
 
         if (desktop.Cpus == null || index < 0 || index >= desktop.Cpus.Count)
-            throw new InvalidOperationException($"CPU index {index} not found on desktop '{name}'.");
+            throw new NotFoundException($"CPU index {index} not found on desktop '{name}'.");
 
         desktop.Cpus[index] = updated;
 

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Desktops/DescribeDesktopUseCase.cs

@@ -15,14 +15,14 @@ public record DesktopDescription(
 
 public class DescribeDesktopUseCase(IHardwareRepository repository) : IUseCase
 {
-    public async Task<DesktopDescription?> ExecuteAsync(string name)
+    public async Task<DesktopDescription> ExecuteAsync(string name)
     {
         name = Normalize.HardwareName(name);
         ThrowIfInvalid.ResourceName(name);
 
         var desktop = await repository.GetByNameAsync(name) as Desktop;
         if (desktop == null)
-            return null;
+            throw new NotFoundException($"Desktop '{name}' not found.");
 
         var ramSummary = desktop.Ram == null
             ? "None"

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Desktops/Drives/AddDesktopDriveUseCase.cs

@@ -11,7 +11,7 @@ public class AddDesktopDriveUseCase(IHardwareRepository repository) : IUseCase
         ThrowIfInvalid.ResourceName(name);
 
         var desktop = await repository.GetByNameAsync(name) as Desktop
-                      ?? throw new InvalidOperationException($"Desktop '{name}' not found.");
+                      ?? throw new NotFoundException($"Desktop '{name}' not found.");
 
         desktop.Drives ??= new List<Drive>();
         desktop.Drives.Add(drive);

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Desktops/Drives/RemoveDesktopDriveUseCase.cs

@@ -11,10 +11,10 @@ public class RemoveDesktopDriveUseCase(IHardwareRepository repository) : IUseCas
         ThrowIfInvalid.ResourceName(name);
 
         var desktop = await repository.GetByNameAsync(name) as Desktop
-                      ?? throw new InvalidOperationException($"Desktop '{name}' not found.");
+                      ?? throw new NotFoundException($"Desktop '{name}' not found.");
 
         if (desktop.Drives == null || index < 0 || index >= desktop.Drives.Count)
-            throw new InvalidOperationException($"Drive index {index} not found on desktop '{name}'.");
+            throw new NotFoundException($"Drive index {index} not found on desktop '{name}'.");
 
         desktop.Drives.RemoveAt(index);
 

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Desktops/Drives/UpdateDesktopDriveUseCase.cs

@@ -11,10 +11,10 @@ public class UpdateDesktopDriveUseCase(IHardwareRepository repository) : IUseCas
         ThrowIfInvalid.ResourceName(name);
 
         var desktop = await repository.GetByNameAsync(name) as Desktop
-                      ?? throw new InvalidOperationException($"Desktop '{name}' not found.");
+                      ?? throw new NotFoundException($"Desktop '{name}' not found.");
 
         if (desktop.Drives == null || index < 0 || index >= desktop.Drives.Count)
-            throw new InvalidOperationException($"Drive index {index} not found on desktop '{name}'.");
+            throw new NotFoundException($"Drive index {index} not found on desktop '{name}'.");
 
         desktop.Drives[index] = updated;
 

+ 7 - 2
RackPeek.Domain/Resources/Hardware/Desktops/GetDesktopUseCase.cs

@@ -5,12 +5,17 @@ namespace RackPeek.Domain.Resources.Hardware.Desktops;
 
 public class GetDesktopUseCase(IHardwareRepository repository) : IUseCase
 {
-    public async Task<Desktop?> ExecuteAsync(string name)
+    public async Task<Desktop> ExecuteAsync(string name)
     {
         name = Normalize.HardwareName(name);
         ThrowIfInvalid.ResourceName(name);
 
         var hardware = await repository.GetByNameAsync(name);
-        return hardware as Desktop;
+        if (hardware is not Desktop desktop)
+        {
+            throw new NotFoundException($"Desktop '{name}' not found.");
+        }
+
+        return desktop;
     }
 }

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Desktops/Gpus/AddDesktopGpuUseCase.cs

@@ -11,7 +11,7 @@ public class AddDesktopGpuUseCase(IHardwareRepository repository) : IUseCase
         ThrowIfInvalid.ResourceName(name);
 
         var desktop = await repository.GetByNameAsync(name) as Desktop
-                      ?? throw new InvalidOperationException($"Desktop '{name}' not found.");
+                      ?? throw new NotFoundException($"Desktop '{name}' not found.");
 
         desktop.Gpus ??= new List<Gpu>();
         desktop.Gpus.Add(gpu);

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Desktops/Gpus/RemoveDesktopGpuUseCase.cs

@@ -11,10 +11,10 @@ public class RemoveDesktopGpuUseCase(IHardwareRepository repository) : IUseCase
         ThrowIfInvalid.ResourceName(name);
 
         var desktop = await repository.GetByNameAsync(name) as Desktop
-                      ?? throw new InvalidOperationException($"Desktop '{name}' not found.");
+                      ?? throw new NotFoundException($"Desktop '{name}' not found.");
 
         if (desktop.Gpus == null || index < 0 || index >= desktop.Gpus.Count)
-            throw new InvalidOperationException($"GPU index {index} not found on desktop '{name}'.");
+            throw new NotFoundException($"GPU index {index} not found on desktop '{name}'.");
 
         desktop.Gpus.RemoveAt(index);
 

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Desktops/Gpus/UpdateDesktopGpuUseCase.cs

@@ -11,10 +11,10 @@ public class UpdateDesktopGpuUseCase(IHardwareRepository repository) : IUseCase
         ThrowIfInvalid.ResourceName(name);
 
         var desktop = await repository.GetByNameAsync(name) as Desktop
-                      ?? throw new InvalidOperationException($"Desktop '{name}' not found.");
+                      ?? throw new NotFoundException($"Desktop '{name}' not found.");
 
         if (desktop.Gpus == null || index < 0 || index >= desktop.Gpus.Count)
-            throw new InvalidOperationException($"GPU index {index} not found on desktop '{name}'.");
+            throw new NotFoundException($"GPU index {index} not found on desktop '{name}'.");
 
         desktop.Gpus[index] = updated;
 

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Desktops/Nics/AddDesktopNicUseCase.cs

@@ -11,7 +11,7 @@ public class AddDesktopNicUseCase(IHardwareRepository repository) : IUseCase
         ThrowIfInvalid.ResourceName(name);
 
         var desktop = await repository.GetByNameAsync(name) as Desktop
-                      ?? throw new InvalidOperationException($"Desktop '{name}' not found.");
+                      ?? throw new NotFoundException($"Desktop '{name}' not found.");
 
         desktop.Nics ??= new List<Nic>();
         desktop.Nics.Add(nic);

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Desktops/Nics/RemoveDesktopNicUseCase.cs

@@ -11,10 +11,10 @@ public class RemoveDesktopNicUseCase(IHardwareRepository repository) : IUseCase
         ThrowIfInvalid.ResourceName(name);
 
         var desktop = await repository.GetByNameAsync(name) as Desktop
-                      ?? throw new InvalidOperationException($"Desktop '{name}' not found.");
+                      ?? throw new NotFoundException($"Desktop '{name}' not found.");
 
         if (desktop.Nics == null || index < 0 || index >= desktop.Nics.Count)
-            throw new InvalidOperationException($"NIC index {index} not found on desktop '{name}'.");
+            throw new NotFoundException($"NIC index {index} not found on desktop '{name}'.");
 
         desktop.Nics.RemoveAt(index);
 

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Desktops/Nics/UpdateDesktopNicUseCase.cs

@@ -11,10 +11,10 @@ public class UpdateDesktopNicUseCase(IHardwareRepository repository) : IUseCase
         ThrowIfInvalid.ResourceName(name);
 
         var desktop = await repository.GetByNameAsync(name) as Desktop
-                      ?? throw new InvalidOperationException($"Desktop '{name}' not found.");
+                      ?? throw new NotFoundException($"Desktop '{name}' not found.");
 
         if (desktop.Nics == null || index < 0 || index >= desktop.Nics.Count)
-            throw new InvalidOperationException($"NIC index {index} not found on desktop '{name}'.");
+            throw new NotFoundException($"NIC index {index} not found on desktop '{name}'.");
 
         desktop.Nics[index] = updated;
 

+ 3 - 3
RackPeek.Domain/Resources/Hardware/Firewalls/DescribeFirewallUseCase.cs

@@ -15,15 +15,15 @@ public record FirewallDescription(
 
 public class DescribeFirewallUseCase(IHardwareRepository repository) : IUseCase
 {
-    public async Task<FirewallDescription?> ExecuteAsync(string name)
+    public async Task<FirewallDescription> ExecuteAsync(string name)
     {
         name = Normalize.HardwareName(name);
         ThrowIfInvalid.ResourceName(name);
 
         var firewallResource = await repository.GetByNameAsync(name) as Firewall;
         if (firewallResource == null)
-            return null;
-
+            throw new NotFoundException($"Firewall '{name}' not found.");
+        
         // If no ports exist, return defaults
         var ports = firewallResource.Ports ?? new List<Port>();
 

+ 7 - 2
RackPeek.Domain/Resources/Hardware/Firewalls/GetFirewallUseCase.cs

@@ -5,12 +5,17 @@ namespace RackPeek.Domain.Resources.Hardware.Firewalls;
 
 public class GetFirewallUseCase(IHardwareRepository repository) : IUseCase
 {
-    public async Task<Firewall?> ExecuteAsync(string name)
+    public async Task<Firewall> ExecuteAsync(string name)
     {
         name = Normalize.HardwareName(name);
         ThrowIfInvalid.ResourceName(name);
 
         var hardware = await repository.GetByNameAsync(name);
-        return hardware as Firewall;
+        if (hardware is not Firewall firewall)
+        {
+            throw new NotFoundException($"Firewall '{name}' not found.");
+        }
+        
+        return firewall;
     }
 }

+ 3 - 2
RackPeek.Domain/Resources/Hardware/GetHardwareSystemTreeUseCase.cs

@@ -9,12 +9,13 @@ public class GetHardwareSystemTreeUseCase(
     ISystemRepository systemRepository,
     IServiceRepository serviceRepository) : IUseCase
 {
-    public async Task<HardwareDependencyTree?> ExecuteAsync(string hardwareName)
+    public async Task<HardwareDependencyTree> ExecuteAsync(string hardwareName)
     {
         ThrowIfInvalid.ResourceName(hardwareName);
 
         var server = await hardwareRepository.GetByNameAsync(hardwareName);
-        if (server is null) return null;
+        if (server is null) 
+            throw new NotFoundException($"Hardware '{hardwareName}' not found.");
 
         return await BuildDependencyTreeAsync(server);
     }

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Laptops/Cpus/UpdateDesktopCpuUseCase.cs

@@ -10,10 +10,10 @@ public class UpdateLaptopCpuUseCase(IHardwareRepository repository) : IUseCase
         name = Normalize.HardwareName(name);
         ThrowIfInvalid.ResourceName(name);
         var laptop = await repository.GetByNameAsync(name) as Laptop
-                     ?? throw new InvalidOperationException($"Laptop '{name}' not found.");
+                     ?? throw new NotFoundException($"Laptop '{name}' not found.");
 
         if (laptop.Cpus == null || index < 0 || index >= laptop.Cpus.Count)
-            throw new InvalidOperationException($"CPU index {index} not found on Laptop '{name}'.");
+            throw new NotFoundException($"CPU index {index} not found on Laptop '{name}'.");
 
         laptop.Cpus[index] = updated;
 

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Laptops/DescribeLaptopUseCase.cs

@@ -5,14 +5,14 @@ namespace RackPeek.Domain.Resources.Hardware.Laptops;
 
 public class DescribeLaptopUseCase(IHardwareRepository repository) : IUseCase
 {
-    public async Task<LaptopDescription?> ExecuteAsync(string name)
+    public async Task<LaptopDescription> ExecuteAsync(string name)
     {
         name = Normalize.HardwareName(name);
         ThrowIfInvalid.ResourceName(name);
 
         var laptop = await repository.GetByNameAsync(name) as Laptop;
         if (laptop == null)
-            return null;
+            throw new NotFoundException($"Laptop '{name}' not found.");
 
         var ramSummary = laptop.Ram == null
             ? "None"

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Laptops/Drives/AddDesktopDriveUseCase.cs

@@ -11,7 +11,7 @@ public class AddLaptopDriveUseCase(IHardwareRepository repository) : IUseCase
         ThrowIfInvalid.ResourceName(name);
 
         var laptop = await repository.GetByNameAsync(name) as Laptop
-                     ?? throw new InvalidOperationException($"Laptop '{name}' not found.");
+                     ?? throw new NotFoundException($"Laptop '{name}' not found.");
 
         laptop.Drives ??= new List<Drive>();
         laptop.Drives.Add(drive);

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Laptops/Drives/RemoveDesktopDriveUseCase.cs

@@ -10,10 +10,10 @@ public class RemoveLaptopDriveUseCase(IHardwareRepository repository) : IUseCase
         name = Normalize.HardwareName(name);
         ThrowIfInvalid.ResourceName(name);
         var laptop = await repository.GetByNameAsync(name) as Laptop
-                     ?? throw new InvalidOperationException($"Laptop '{name}' not found.");
+                     ?? throw new NotFoundException($"Laptop '{name}' not found.");
 
         if (laptop.Drives == null || index < 0 || index >= laptop.Drives.Count)
-            throw new InvalidOperationException($"Drive index {index} not found on Laptop '{name}'.");
+            throw new NotFoundException($"Drive index {index} not found on Laptop '{name}'.");
 
         laptop.Drives.RemoveAt(index);
 

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Laptops/Drives/UpdateDesktopDriveUseCase.cs

@@ -11,10 +11,10 @@ public class UpdateLaptopDriveUseCase(IHardwareRepository repository) : IUseCase
         ThrowIfInvalid.ResourceName(name);
 
         var laptop = await repository.GetByNameAsync(name) as Laptop
-                     ?? throw new InvalidOperationException($"Laptop '{name}' not found.");
+                     ?? throw new NotFoundException($"Laptop '{name}' not found.");
 
         if (laptop.Drives == null || index < 0 || index >= laptop.Drives.Count)
-            throw new InvalidOperationException($"Drive index {index} not found on Laptop '{name}'.");
+            throw new NotFoundException($"Drive index {index} not found on Laptop '{name}'.");
 
         laptop.Drives[index] = updated;
 

+ 7 - 2
RackPeek.Domain/Resources/Hardware/Laptops/GetDesktopUseCase.cs

@@ -5,12 +5,17 @@ namespace RackPeek.Domain.Resources.Hardware.Laptops;
 
 public class GetLaptopUseCase(IHardwareRepository repository) : IUseCase
 {
-    public async Task<Laptop?> ExecuteAsync(string name)
+    public async Task<Laptop> ExecuteAsync(string name)
     {
         name = Normalize.HardwareName(name);
         ThrowIfInvalid.ResourceName(name);
 
         var hardware = await repository.GetByNameAsync(name);
-        return hardware as Laptop;
+        if (hardware is not Laptop laptop)
+        {
+            throw new NotFoundException($"Laptop '{name}' not found.");
+        }
+
+        return laptop;
     }
 }

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Laptops/Gpus/RemoveDesktopGpuUseCase.cs

@@ -10,10 +10,10 @@ public class RemoveLaptopGpuUseCase(IHardwareRepository repository) : IUseCase
         name = Normalize.HardwareName(name);
         ThrowIfInvalid.ResourceName(name);
         var laptop = await repository.GetByNameAsync(name) as Laptop
-                     ?? throw new InvalidOperationException($"Laptop '{name}' not found.");
+                     ?? throw new NotFoundException($"Laptop '{name}' not found.");
 
         if (laptop.Gpus == null || index < 0 || index >= laptop.Gpus.Count)
-            throw new InvalidOperationException($"GPU index {index} not found on Laptop '{name}'.");
+            throw new NotFoundException($"GPU index {index} not found on Laptop '{name}'.");
 
         laptop.Gpus.RemoveAt(index);
 

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Laptops/Gpus/UpdateDesktopGpuUseCase.cs

@@ -11,10 +11,10 @@ public class UpdateLaptopGpuUseCase(IHardwareRepository repository) : IUseCase
         ThrowIfInvalid.ResourceName(name);
 
         var laptop = await repository.GetByNameAsync(name) as Laptop
-                     ?? throw new InvalidOperationException($"Laptop '{name}' not found.");
+                     ?? throw new NotFoundException($"Laptop '{name}' not found.");
 
         if (laptop.Gpus == null || index < 0 || index >= laptop.Gpus.Count)
-            throw new InvalidOperationException($"GPU index {index} not found on Laptop '{name}'.");
+            throw new NotFoundException($"GPU index {index} not found on Laptop '{name}'.");
 
         laptop.Gpus[index] = updated;
 

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Routers/DescribeRouterUseCase.cs

@@ -15,14 +15,14 @@ public record RouterDescription(
 
 public class DescribeRouterUseCase(IHardwareRepository repository) : IUseCase
 {
-    public async Task<RouterDescription?> ExecuteAsync(string name)
+    public async Task<RouterDescription> ExecuteAsync(string name)
     {
         name = Normalize.HardwareName(name);
         ThrowIfInvalid.ResourceName(name);
 
         var routerResource = await repository.GetByNameAsync(name) as Router;
         if (routerResource == null)
-            return null;
+            throw new NotFoundException($"Router '{name}' not found.");
 
         // If no ports exist, return defaults
         var ports = routerResource.Ports ?? new List<Port>();

+ 7 - 2
RackPeek.Domain/Resources/Hardware/Routers/GetRouterUseCase.cs

@@ -5,12 +5,17 @@ namespace RackPeek.Domain.Resources.Hardware.Routers;
 
 public class GetRouterUseCase(IHardwareRepository repository) : IUseCase
 {
-    public async Task<Router?> ExecuteAsync(string name)
+    public async Task<Router> ExecuteAsync(string name)
     {
         name = Normalize.HardwareName(name);
         ThrowIfInvalid.ResourceName(name);
 
         var hardware = await repository.GetByNameAsync(name);
-        return hardware as Router;
+        if (hardware is not Router router)
+        {
+            throw new NotFoundException($"Router '{name}' not found.");
+        }
+        
+        return router;
     }
 }

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Servers/DescribeServerUseCase.cs

@@ -16,14 +16,14 @@ public record ServerDescription(
 
 public class DescribeServerUseCase(IHardwareRepository repository) : IUseCase
 {
-    public async Task<ServerDescription?> ExecuteAsync(string name)
+    public async Task<ServerDescription> ExecuteAsync(string name)
     {
         name = Normalize.HardwareName(name);
         ThrowIfInvalid.ResourceName(name);
 
         var server = await repository.GetByNameAsync(name) as Server;
         if (server == null)
-            return null;
+            throw new NotFoundException($"Server '{name}' not found.");
 
         var cpuSummary = server.Cpus == null
             ? "Unknown"

+ 7 - 2
RackPeek.Domain/Resources/Hardware/Servers/GetServerUseCase.cs

@@ -5,11 +5,16 @@ namespace RackPeek.Domain.Resources.Hardware.Servers;
 
 public class GetServerUseCase(IHardwareRepository repository) : IUseCase
 {
-    public async Task<Server?> ExecuteAsync(string name)
+    public async Task<Server> ExecuteAsync(string name)
     {
         name = Normalize.HardwareName(name);
         ThrowIfInvalid.ResourceName(name);
         var hardware = await repository.GetByNameAsync(name);
-        return hardware as Server;
+        if (hardware is not Server server)
+        {
+            throw new NotFoundException($"Server '{name}' not found.");
+        }
+
+        return server;
     }
 }

+ 3 - 3
RackPeek.Domain/Resources/Hardware/Switches/DescribeSwitchUseCase.cs

@@ -15,15 +15,15 @@ public record SwitchDescription(
 
 public class DescribeSwitchUseCase(IHardwareRepository repository) : IUseCase
 {
-    public async Task<SwitchDescription?> ExecuteAsync(string name)
+    public async Task<SwitchDescription> ExecuteAsync(string name)
     {
         name = Normalize.HardwareName(name);
         ThrowIfInvalid.ResourceName(name);
 
         var switchResource = await repository.GetByNameAsync(name) as Switch;
         if (switchResource == null)
-            return null;
-
+            throw new NotFoundException($"Switch '{name}' not found.");
+        
         // If no ports exist, return defaults
         var ports = switchResource.Ports ?? new List<Port>();
 

+ 7 - 2
RackPeek.Domain/Resources/Hardware/Switches/GetSwitchUseCase.cs

@@ -5,12 +5,17 @@ namespace RackPeek.Domain.Resources.Hardware.Switches;
 
 public class GetSwitchUseCase(IHardwareRepository repository) : IUseCase
 {
-    public async Task<Switch?> ExecuteAsync(string name)
+    public async Task<Switch> ExecuteAsync(string name)
     {
         name = Normalize.HardwareName(name);
         ThrowIfInvalid.ResourceName(name);
 
         var hardware = await repository.GetByNameAsync(name);
-        return hardware as Switch;
+        if (hardware is not Switch _switch)
+        {
+            throw new NotFoundException($"Switch '{name}' not found.");
+        }
+        
+        return _switch;
     }
 }

+ 2 - 2
RackPeek.Domain/Resources/Hardware/UpsUnits/DescribeUpsUseCase.cs

@@ -11,14 +11,14 @@ public record UpsDescription(
 
 public class DescribeUpsUseCase(IHardwareRepository repository) : IUseCase
 {
-    public async Task<UpsDescription?> ExecuteAsync(string name)
+    public async Task<UpsDescription> ExecuteAsync(string name)
     {
         name = Normalize.HardwareName(name);
         ThrowIfInvalid.ResourceName(name);
 
         var ups = await repository.GetByNameAsync(name) as Ups;
         if (ups == null)
-            return null;
+            throw new NotFoundException($"Ups '{name}' not found.");
 
         return new UpsDescription(
             ups.Name,

+ 6 - 2
RackPeek.Domain/Resources/Hardware/UpsUnits/GetUpsUnitUseCase.cs

@@ -5,12 +5,16 @@ namespace RackPeek.Domain.Resources.Hardware.UpsUnits;
 
 public class GetUpsUnitUseCase(IHardwareRepository repository) : IUseCase
 {
-    public async Task<Ups?> ExecuteAsync(string name)
+    public async Task<Ups> ExecuteAsync(string name)
     {
         name = Normalize.HardwareName(name);
         ThrowIfInvalid.ResourceName(name);
 
         var hardware = await repository.GetByNameAsync(name);
-        return hardware as Ups;
+        if (hardware is not Ups ups)
+        {
+            throw new NotFoundException($"Ups '{name}' not found.");
+        }
+        return ups;
     }
 }

+ 2 - 2
RackPeek.Domain/Resources/Services/UseCases/DescribeServiceUseCase.cs

@@ -15,13 +15,13 @@ public record ServiceDescription(
 
 public class DescribeServiceUseCase(IServiceRepository repository, ISystemRepository systemRepo) : IUseCase
 {
-    public async Task<ServiceDescription?> ExecuteAsync(string name)
+    public async Task<ServiceDescription> ExecuteAsync(string name)
     {
         name = Normalize.ServiceName(name);
         ThrowIfInvalid.ResourceName(name);
         var service = await repository.GetByNameAsync(name);
         if (service is null)
-            return null;
+            throw new NotFoundException($"Service '{name}' not found.");
 
         string? runsOnPhysicalHost = null;
         if (!string.IsNullOrEmpty(service.RunsOn))

+ 9 - 2
RackPeek.Domain/Resources/Services/UseCases/GetServiceUseCase.cs

@@ -4,10 +4,17 @@ namespace RackPeek.Domain.Resources.Services.UseCases;
 
 public class GetServiceUseCase(IServiceRepository repository) : IUseCase
 {
-    public async Task<Service?> ExecuteAsync(string name)
+    public async Task<Service> ExecuteAsync(string name)
     {
         name = Normalize.ServiceName(name);
         ThrowIfInvalid.ResourceName(name);
-        return await repository.GetByNameAsync(name);
+        var resource = await repository.GetByNameAsync(name);
+
+        if (resource is null)
+        {
+            throw new NotFoundException($"Service '{name}' not found.");
+        }
+        
+        return resource;
     }
 }

+ 2 - 2
RackPeek.Domain/Resources/SystemResources/UseCases/DescribeSystemUseCase.cs

@@ -14,13 +14,13 @@ public record SystemDescription(
 
 public class DescribeSystemUseCase(ISystemRepository repository) : IUseCase
 {
-    public async Task<SystemDescription?> ExecuteAsync(string name)
+    public async Task<SystemDescription> ExecuteAsync(string name)
     {
         name = Normalize.SystemName(name);
         ThrowIfInvalid.ResourceName(name);
         var system = await repository.GetByNameAsync(name);
         if (system is null)
-            return null;
+            throw new NotFoundException($"System '{name}' not found.");
 
         return new SystemDescription(
             system.Name,

+ 5 - 3
RackPeek.Domain/Resources/SystemResources/UseCases/GetSystemServiceTreeUseCase.cs

@@ -8,13 +8,15 @@ public class GetSystemServiceTreeUseCase(
     ISystemRepository systemRepository,
     IServiceRepository serviceRepository) : IUseCase
 {
-    public async Task<SystemDependencyTree?> ExecuteAsync(string name)
+    public async Task<SystemDependencyTree> ExecuteAsync(string name)
     {
         name = Normalize.SystemName(name);
         ThrowIfInvalid.ResourceName(name);
         var system = await systemRepository.GetByNameAsync(name);
-        if (system is null) return null;
-
+        if (system is null)
+        {
+            throw new NotFoundException($"System '{name}' not found.");
+        }
         var services = await serviceRepository.GetBySystemHostAsync(system.Name);
 
         return new SystemDependencyTree(system, services);

+ 9 - 2
RackPeek.Domain/Resources/SystemResources/UseCases/GetSystemUseCase.cs

@@ -4,10 +4,17 @@ namespace RackPeek.Domain.Resources.SystemResources.UseCases;
 
 public class GetSystemUseCase(ISystemRepository repository) : IUseCase
 {
-    public async Task<SystemResource?> ExecuteAsync(string name)
+    public async Task<SystemResource> ExecuteAsync(string name)
     {
         name = Normalize.SystemName(name);
         ThrowIfInvalid.ResourceName(name);
-        return await repository.GetByNameAsync(name);
+        var system = await repository.GetByNameAsync(name);
+
+        if (system == null)
+        {
+            throw new NotFoundException($"System '{name}' not found.");
+        }
+        
+        return system;
     }
 }

+ 1 - 7
RackPeek/Commands/AccessPoints/AccessPointDescribeCommand.cs

@@ -18,13 +18,7 @@ public class AccessPointDescribeCommand(
         var useCase = scope.ServiceProvider.GetRequiredService<DescribeAccessPointUseCase>();
 
         var ap = await useCase.ExecuteAsync(settings.Name);
-
-        if (ap == null)
-        {
-            AnsiConsole.MarkupLine($"[red]Access Point '{settings.Name}' not found.[/]");
-            return 1;
-        }
-
+        
         var grid = new Grid()
             .AddColumn(new GridColumn().NoWrap())
             .AddColumn(new GridColumn().NoWrap());

+ 0 - 6
RackPeek/Commands/AccessPoints/AccessPointGetByNameCommand.cs

@@ -19,12 +19,6 @@ public class AccessPointGetByNameCommand(
 
         var ap = await useCase.ExecuteAsync(settings.Name);
 
-        if (ap == null)
-        {
-            AnsiConsole.MarkupLine($"[red]Access Point '{settings.Name}' not found.[/]");
-            return 1;
-        }
-
         AnsiConsole.MarkupLine(
             $"[green]{ap.Name}[/]  Model: {ap.Model ?? "Unknown"}, Speed: {ap.Speed?.ToString() ?? "Unknown"}Gbps");
 

+ 1 - 7
RackPeek/Commands/Desktops/DesktopDescribeCommand.cs

@@ -17,13 +17,7 @@ public class DesktopDescribeCommand(IServiceProvider provider)
         var useCase = scope.ServiceProvider.GetRequiredService<DescribeDesktopUseCase>();
 
         var result = await useCase.ExecuteAsync(settings.Name);
-
-        if (result == null)
-        {
-            AnsiConsole.MarkupLine($"[red]Desktop '{settings.Name}' not found.[/]");
-            return 1;
-        }
-
+        
         var grid = new Grid().AddColumn().AddColumn();
 
         grid.AddRow("Name:", result.Name);

+ 0 - 6
RackPeek/Commands/Desktops/DesktopGetByNameCommand.cs

@@ -18,12 +18,6 @@ public class DesktopGetByNameCommand(IServiceProvider provider)
 
         var desktop = await useCase.ExecuteAsync(settings.Name);
 
-        if (desktop == null)
-        {
-            AnsiConsole.MarkupLine($"[red]Desktop '{settings.Name}' not found.[/]");
-            return 1;
-        }
-
         AnsiConsole.MarkupLine($"[green]{desktop.Name}[/] (Model: {desktop.Model ?? "Unknown"})");
         return 0;
     }

+ 0 - 6
RackPeek/Commands/Desktops/DesktopTreeCommand.cs

@@ -14,12 +14,6 @@ public sealed class DesktopTreeCommand(GetHardwareSystemTreeUseCase useCase)
     {
         var tree = await useCase.ExecuteAsync(settings.Name);
 
-        if (tree is null)
-        {
-            AnsiConsole.MarkupLine($"[red]Error:[/] Desktop '{settings.Name}' not found.");
-            return -1;
-        }
-
         var root = new Tree($"[bold]{tree.Hardware.Name}[/]");
 
         foreach (var system in tree.Systems)

+ 0 - 6
RackPeek/Commands/Firewalls/FirewallDescribeCommand.cs

@@ -19,12 +19,6 @@ public class FirewallDescribeCommand(
 
         var sw = await useCase.ExecuteAsync(settings.Name);
 
-        if (sw == null)
-        {
-            AnsiConsole.MarkupLine($"[red]Firewall '{settings.Name}' not found.[/]");
-            return 1;
-        }
-
         var grid = new Grid()
             .AddColumn(new GridColumn().NoWrap())
             .AddColumn(new GridColumn().NoWrap());

+ 0 - 6
RackPeek/Commands/Firewalls/FirewallGetByNameCommand.cs

@@ -19,12 +19,6 @@ public class FirewallGetByNameCommand(
 
         var sw = await useCase.ExecuteAsync(settings.Name);
 
-        if (sw == null)
-        {
-            AnsiConsole.MarkupLine($"[red]Firewall '{settings.Name}' not found.[/]");
-            return 1;
-        }
-
         AnsiConsole.MarkupLine(
             $"[green]{sw.Name}[/]  Model: {sw.Model ?? "Unknown"}, Managed: {(sw.Managed == true ? "Yes" : "No")}, PoE: {(sw.Poe == true ? "Yes" : "No")}");
 

+ 1 - 1
RackPeek/Commands/Firewalls/FirewallGetCommand.cs

@@ -20,7 +20,7 @@ public class FirewallGetCommand(
 
         if (report.Firewalls.Count == 0)
         {
-            AnsiConsole.MarkupLine("[yellow]No Firewalles found.[/]");
+            AnsiConsole.MarkupLine("[yellow]No Firewalls found.[/]");
             return 0;
         }
 

+ 1 - 1
RackPeek/Commands/Firewalls/FirewallSetCommand.cs

@@ -33,7 +33,7 @@ public class FirewallSetCommand(
             settings.Managed,
             settings.Poe);
 
-        AnsiConsole.MarkupLine($"[green]Server '{settings.Name}' updated.[/]");
+        AnsiConsole.MarkupLine($"[green]Firewall '{settings.Name}' updated.[/]");
         return 0;
     }
 }

+ 0 - 6
RackPeek/Commands/Laptops/LaptopDescribeCommand.cs

@@ -18,12 +18,6 @@ public class LaptopDescribeCommand(IServiceProvider provider)
 
         var result = await useCase.ExecuteAsync(settings.Name);
 
-        if (result == null)
-        {
-            AnsiConsole.MarkupLine($"[red]Laptop '{settings.Name}' not found.[/]");
-            return 1;
-        }
-
         var grid = new Grid().AddColumn().AddColumn();
 
         grid.AddRow("Name:", result.Name);

+ 2 - 8
RackPeek/Commands/Laptops/LaptopGetByNameCommand.cs

@@ -16,15 +16,9 @@ public class LaptopGetByNameCommand(IServiceProvider provider)
         using var scope = provider.CreateScope();
         var useCase = scope.ServiceProvider.GetRequiredService<GetLaptopUseCase>();
 
-        var Laptop = await useCase.ExecuteAsync(settings.Name);
+        var laptop = await useCase.ExecuteAsync(settings.Name);
 
-        if (Laptop == null)
-        {
-            AnsiConsole.MarkupLine($"[red]Laptop '{settings.Name}' not found.[/]");
-            return 1;
-        }
-
-        AnsiConsole.MarkupLine($"[green]{Laptop.Name}[/]");
+        AnsiConsole.MarkupLine($"[green]{laptop.Name}[/]");
         return 0;
     }
 }

+ 3 - 3
RackPeek/Commands/Laptops/LaptopGetCommand.cs

@@ -15,9 +15,9 @@ public class LaptopGetCommand(IServiceProvider provider)
         using var scope = provider.CreateScope();
         var useCase = scope.ServiceProvider.GetRequiredService<GetLaptopsUseCase>();
 
-        var Laptops = await useCase.ExecuteAsync();
+        var laptops = await useCase.ExecuteAsync();
 
-        if (Laptops.Count == 0)
+        if (laptops.Count == 0)
         {
             AnsiConsole.MarkupLine("[yellow]No Laptops found.[/]");
             return 0;
@@ -31,7 +31,7 @@ public class LaptopGetCommand(IServiceProvider provider)
             .AddColumn("Drives")
             .AddColumn("GPUs");
 
-        foreach (var d in Laptops)
+        foreach (var d in laptops)
             table.AddRow(
                 d.Name,
                 (d.Cpus?.Count ?? 0).ToString(),

+ 0 - 6
RackPeek/Commands/Laptops/LaptopTreeCommand.cs

@@ -14,12 +14,6 @@ public sealed class LaptopTreeCommand(GetHardwareSystemTreeUseCase useCase)
     {
         var tree = await useCase.ExecuteAsync(settings.Name);
 
-        if (tree is null)
-        {
-            AnsiConsole.MarkupLine($"[red]Error:[/] Laptop '{settings.Name}' not found.");
-            return -1;
-        }
-
         var root = new Tree($"[bold]{tree.Hardware.Name}[/]");
 
         foreach (var system in tree.Systems)

+ 0 - 6
RackPeek/Commands/Routers/RouterDescribeCommand.cs

@@ -19,12 +19,6 @@ public class RouterDescribeCommand(
 
         var sw = await useCase.ExecuteAsync(settings.Name);
 
-        if (sw == null)
-        {
-            AnsiConsole.MarkupLine($"[red]Router '{settings.Name}' not found.[/]");
-            return 1;
-        }
-
         var grid = new Grid()
             .AddColumn(new GridColumn().NoWrap())
             .AddColumn(new GridColumn().NoWrap());

+ 1 - 7
RackPeek/Commands/Routers/RouterGetByNameCommand.cs

@@ -18,13 +18,7 @@ public class RouterGetByNameCommand(
         var useCase = scope.ServiceProvider.GetRequiredService<DescribeRouterUseCase>();
 
         var sw = await useCase.ExecuteAsync(settings.Name);
-
-        if (sw == null)
-        {
-            AnsiConsole.MarkupLine($"[red]Router '{settings.Name}' not found.[/]");
-            return 1;
-        }
-
+        
         AnsiConsole.MarkupLine(
             $"[green]{sw.Name}[/]  Model: {sw.Model ?? "Unknown"}, Managed: {(sw.Managed == true ? "Yes" : "No")}, PoE: {(sw.Poe == true ? "Yes" : "No")}");
 

+ 1 - 1
RackPeek/Commands/Routers/RouterGetCommand.cs

@@ -20,7 +20,7 @@ public class RouterGetCommand(
 
         if (report.Routers.Count == 0)
         {
-            AnsiConsole.MarkupLine("[yellow]No Routeres found.[/]");
+            AnsiConsole.MarkupLine("[yellow]No routers found.[/]");
             return 0;
         }
 

+ 1 - 1
RackPeek/Commands/Routers/RouterReportCommand.cs

@@ -20,7 +20,7 @@ public class RouterReportCommand(
 
         if (report.Routers.Count == 0)
         {
-            AnsiConsole.MarkupLine("[yellow]No Routeres found.[/]");
+            AnsiConsole.MarkupLine("[yellow]No Routers found.[/]");
             return 0;
         }
 

+ 0 - 6
RackPeek/Commands/Servers/ServerDescribeCommand.cs

@@ -19,12 +19,6 @@ public class ServerDescribeCommand(
 
         var server = await useCase.ExecuteAsync(settings.Name);
 
-        if (server == null)
-        {
-            AnsiConsole.MarkupLine($"[red]Server '{settings.Name}' not found.[/]");
-            return 1;
-        }
-
         var grid = new Grid()
             .AddColumn()
             .AddColumn();

+ 0 - 6
RackPeek/Commands/Servers/ServerGetByNameCommand.cs

@@ -19,12 +19,6 @@ public class ServerGetByNameCommand(
 
         var server = await useCase.ExecuteAsync(settings.Name);
 
-        if (server == null)
-        {
-            AnsiConsole.MarkupLine($"[red]Server '{settings.Name}' not found.[/]");
-            return 1;
-        }
-
         AnsiConsole.MarkupLine(
             $"[green]{server.Name}[/]  RAM: {server.Ram?.Size} GB, IPMI: {(server.Ipmi == true ? "yes" : "no")}");
 

+ 0 - 6
RackPeek/Commands/Services/ServiceDescribeCommand.cs

@@ -19,12 +19,6 @@ public class ServiceDescribeCommand(
 
         var service = await useCase.ExecuteAsync(settings.Name);
 
-        if (service == null)
-        {
-            AnsiConsole.MarkupLine($"[red]Service '{settings.Name}' not found.[/]");
-            return 1;
-        }
-
         var grid = new Grid()
             .AddColumn(new GridColumn().NoWrap())
             .AddColumn(new GridColumn().NoWrap())

+ 3 - 9
RackPeek/Commands/Services/ServiceGetByNameCommand.cs

@@ -17,16 +17,10 @@ public class ServiceGetByNameCommand(
         using var scope = serviceProvider.CreateScope();
         var useCase = scope.ServiceProvider.GetRequiredService<DescribeServiceUseCase>();
 
-        var Service = await useCase.ExecuteAsync(settings.Name);
-
-        if (Service == null)
-        {
-            AnsiConsole.MarkupLine($"[red]Service '{settings.Name}' not found.[/]");
-            return 1;
-        }
-
+        var service = await useCase.ExecuteAsync(settings.Name);
+        
         AnsiConsole.MarkupLine(
-            $"[green]{Service.Name}[/]  Ip: {Service.Ip ?? "Unknown"}, Port: {Service.Port.ToString() ?? "Unknown"}, Protocol: {Service.Protocol ?? "Unknown"}, Url: {Service.Url ?? "Unknown"}, RunsOn: {ServicesFormatExtensions.FormatRunsOn(Service.RunsOnSystemHost, Service.RunsOnPhysicalHost)}");
+            $"[green]{service.Name}[/]  Ip: {service.Ip ?? "Unknown"}, Port: {service.Port.ToString() ?? "Unknown"}, Protocol: {service.Protocol ?? "Unknown"}, Url: {service.Url ?? "Unknown"}, RunsOn: {ServicesFormatExtensions.FormatRunsOn(service.RunsOnSystemHost, service.RunsOnPhysicalHost)}");
         return 0;
     }
 }

+ 0 - 6
RackPeek/Commands/Switches/SwitchDescribeCommand.cs

@@ -19,12 +19,6 @@ public class SwitchDescribeCommand(
 
         var sw = await useCase.ExecuteAsync(settings.Name);
 
-        if (sw == null)
-        {
-            AnsiConsole.MarkupLine($"[red]Switch '{settings.Name}' not found.[/]");
-            return 1;
-        }
-
         var grid = new Grid()
             .AddColumn(new GridColumn().NoWrap())
             .AddColumn(new GridColumn().NoWrap());

+ 1 - 7
RackPeek/Commands/Switches/SwitchGetByNameCommand.cs

@@ -18,13 +18,7 @@ public class SwitchGetByNameCommand(
         var useCase = scope.ServiceProvider.GetRequiredService<DescribeSwitchUseCase>();
 
         var sw = await useCase.ExecuteAsync(settings.Name);
-
-        if (sw == null)
-        {
-            AnsiConsole.MarkupLine($"[red]Switch '{settings.Name}' not found.[/]");
-            return 1;
-        }
-
+        
         AnsiConsole.MarkupLine(
             $"[green]{sw.Name}[/]  Model: {sw.Model ?? "Unknown"}, Managed: {(sw.Managed == true ? "Yes" : "No")}, PoE: {(sw.Poe == true ? "Yes" : "No")}");
 

+ 0 - 6
RackPeek/Commands/Systems/SystemDescribeCommand.cs

@@ -19,12 +19,6 @@ public class SystemDescribeCommand(
 
         var system = await useCase.ExecuteAsync(settings.Name);
 
-        if (system == null)
-        {
-            AnsiConsole.MarkupLine($"[red]System '{settings.Name}' not found.[/]");
-            return 1;
-        }
-
         var grid = new Grid()
             .AddColumn(new GridColumn().NoWrap())
             .AddColumn(new GridColumn().NoWrap());

+ 0 - 7
RackPeek/Commands/Systems/SystemGetByNameCommand.cs

@@ -18,13 +18,6 @@ public class SystemGetByNameCommand(
         var useCase = scope.ServiceProvider.GetRequiredService<DescribeSystemUseCase>();
 
         var system = await useCase.ExecuteAsync(settings.Name);
-
-        if (system == null)
-        {
-            AnsiConsole.MarkupLine($"[red]System '{settings.Name}' not found.[/]");
-            return 1;
-        }
-
         AnsiConsole.MarkupLine(
             $"[green]{system.Name}[/]  Type: {system.Type ?? "Unknown"}, OS: {system.Os ?? "Unknown"}, " +
             $"Cores: {system.Cores}, RAM: {system.RamGb}GB, Storage: {system.TotalStorageGb}GB, RunsOn: {system.RunsOn ?? "Unknown"}");

+ 1 - 7
RackPeek/Commands/Systems/SystemTreeCommand.cs

@@ -12,13 +12,7 @@ public sealed class SystemTreeCommand(GetSystemServiceTreeUseCase useCase) : Asy
         CancellationToken cancellationToken)
     {
         var tree = await useCase.ExecuteAsync(settings.Name);
-
-        if (tree is null)
-        {
-            AnsiConsole.MarkupLine($"[red]System '{settings.Name}' not found.[/]");
-            return -1;
-        }
-
+        
         var root = new Tree($"[bold]{tree.System.Name}[/]");
 
         foreach (var system in tree.Services)

+ 0 - 6
RackPeek/Commands/Ups/UpsDescribeCommand.cs

@@ -18,12 +18,6 @@ public class UpsDescribeCommand(IServiceProvider provider)
 
         var ups = await useCase.ExecuteAsync(settings.Name);
 
-        if (ups == null)
-        {
-            AnsiConsole.MarkupLine($"[red]UPS '{settings.Name}' not found.[/]");
-            return 1;
-        }
-
         var grid = new Grid()
             .AddColumn()
             .AddColumn();

+ 1 - 7
RackPeek/Commands/Ups/UpsGetByNameCommand.cs

@@ -17,13 +17,7 @@ public class UpsGetByNameCommand(IServiceProvider provider)
         var useCase = scope.ServiceProvider.GetRequiredService<DescribeUpsUseCase>();
 
         var ups = await useCase.ExecuteAsync(settings.Name);
-
-        if (ups == null)
-        {
-            AnsiConsole.MarkupLine($"[red]UPS '{settings.Name}' not found.[/]");
-            return 1;
-        }
-
+        
         AnsiConsole.MarkupLine(
             $"[green]{ups.Name}[/]  Model: {ups.Model ?? "Unknown"}, VA: {ups.Va?.ToString() ?? "Unknown"}");
 

+ 2 - 4
Tests/HardwareResources/AccessPoints/DescribeAccessPointUseCaseTests.cs

@@ -1,4 +1,5 @@
 using NSubstitute;
+using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.Hardware.AccessPoints;
 using RackPeek.Domain.Resources.Hardware.Models;
@@ -17,10 +18,7 @@ public class DescribeAccessPointUseCaseTests
         var sut = new DescribeAccessPointUseCase(repo);
 
         // Act
-        var result = await sut.ExecuteAsync("ap01");
-
-        // Assert
-        Assert.Null(result);
+        await Assert.ThrowsAsync<NotFoundException>(() => sut.ExecuteAsync("ap01"));
     }
 
     [Fact]

+ 2 - 3
Tests/HardwareResources/AccessPoints/GetAccessPointUseCaseTests.cs

@@ -1,4 +1,5 @@
 using NSubstitute;
+using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.Hardware.AccessPoints;
 using RackPeek.Domain.Resources.Hardware.Models;
@@ -35,9 +36,7 @@ public class GetAccessPointUseCaseTests
         var sut = new GetAccessPointUseCase(repo);
 
         // Act
-        var result = await sut.ExecuteAsync("node01");
+        await Assert.ThrowsAsync<NotFoundException>(() => sut.ExecuteAsync("node01"));
 
-        // Assert
-        Assert.Null(result);
     }
 }

+ 2 - 3
Tests/HardwareResources/DescribeServerUseCaseTests.cs

@@ -1,4 +1,5 @@
 using NSubstitute;
+using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.Hardware.Models;
 using RackPeek.Domain.Resources.Hardware.Servers;
@@ -60,9 +61,7 @@ public class DescribeServerUseCaseTests
         var sut = new DescribeServerUseCase(repo);
 
         // Act
-        var description = await sut.ExecuteAsync("node01");
+        await Assert.ThrowsAsync<NotFoundException>(() => sut.ExecuteAsync("node01"));
 
-        // Assert
-        Assert.Null(description);
     }
 }

+ 2 - 2
Tests/HardwareResources/Desktops/DescribeDesktopUseCaseTests.cs

@@ -1,4 +1,5 @@
 using NSubstitute;
+using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.Hardware.Desktops;
 using RackPeek.Domain.Resources.Hardware.Models;
@@ -42,8 +43,7 @@ public class DescribeDesktopUseCaseTests
 
         var useCase = new DescribeDesktopUseCase(repo);
 
-        var result = await useCase.ExecuteAsync("desk1");
+        await Assert.ThrowsAsync<NotFoundException>(() => useCase.ExecuteAsync("desk1"));
 
-        Assert.Null(result);
     }
 }

+ 2 - 2
Tests/HardwareResources/Desktops/GetDesktopUseCaseTests.cs

@@ -1,4 +1,5 @@
 using NSubstitute;
+using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.Hardware.Desktops;
 using RackPeek.Domain.Resources.Hardware.Models;
@@ -29,8 +30,7 @@ public class GetDesktopUseCaseTests
 
         var useCase = new GetDesktopUseCase(repo);
 
-        var result = await useCase.ExecuteAsync("desk1");
+        await Assert.ThrowsAsync<NotFoundException>(() => useCase.ExecuteAsync("desk1"));
 
-        Assert.Null(result);
     }
 }

+ 3 - 6
Tests/HardwareResources/GetServerUseCaseTests.cs

@@ -1,4 +1,5 @@
 using NSubstitute;
+using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.Hardware.Models;
 using RackPeek.Domain.Resources.Hardware.Servers;
@@ -35,10 +36,8 @@ public class GetServerUseCaseTests
         var sut = new GetServerUseCase(repo);
 
         // Act
-        var server = await sut.ExecuteAsync("node01");
+        await Assert.ThrowsAsync<NotFoundException>(() => sut.ExecuteAsync("node01"));
 
-        // Assert
-        Assert.Null(server);
     }
 
     [Fact]
@@ -51,9 +50,7 @@ public class GetServerUseCaseTests
         var sut = new GetServerUseCase(repo);
 
         // Act
-        var server = await sut.ExecuteAsync("node01");
+        await Assert.ThrowsAsync<NotFoundException>(() => sut.ExecuteAsync("node01"));
 
-        // Assert
-        Assert.Null(server);
     }
 }

+ 2 - 3
Tests/HardwareResources/Switches/DescribeSwitchUseCaseTests.cs

@@ -1,4 +1,5 @@
 using NSubstitute;
+using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.Hardware.Models;
 using RackPeek.Domain.Resources.Hardware.Switches;
@@ -17,10 +18,8 @@ public class DescribeSwitchUseCaseTests
         var sut = new DescribeSwitchUseCase(repo);
 
         // Act
-        var result = await sut.ExecuteAsync("sw01");
+        await Assert.ThrowsAsync<NotFoundException>(() => sut.ExecuteAsync("sw01"));
 
-        // Assert
-        Assert.Null(result);
     }
 
     [Fact]

+ 2 - 3
Tests/HardwareResources/Switches/GetSwitchUseCaseTests.cs

@@ -1,4 +1,5 @@
 using NSubstitute;
+using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.Hardware.Models;
 using RackPeek.Domain.Resources.Hardware.Switches;
@@ -35,9 +36,7 @@ public class GetSwitchUseCaseTests
         var sut = new GetSwitchUseCase(repo);
 
         // Act
-        var result = await sut.ExecuteAsync("node01");
+        await Assert.ThrowsAsync<NotFoundException>(() => sut.ExecuteAsync("node01"));
 
-        // Assert
-        Assert.Null(result);
     }
 }

+ 2 - 2
Tests/HardwareResources/Ups/DescribeUpsUseCaseTests.cs

@@ -1,4 +1,5 @@
 using NSubstitute;
+using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.Hardware.Models;
 using RackPeek.Domain.Resources.Hardware.UpsUnits;
@@ -15,9 +16,8 @@ public class DescribeUpsUseCaseTests
 
         var sut = new DescribeUpsUseCase(repo);
 
-        var result = await sut.ExecuteAsync("ups01");
+        await Assert.ThrowsAsync<NotFoundException>(() => sut.ExecuteAsync("ups01"));
 
-        Assert.Null(result);
     }
 
     [Fact]

+ 2 - 2
Tests/HardwareResources/Ups/GetUpsUnitUseCaseTests.cs

@@ -1,4 +1,5 @@
 using NSubstitute;
+using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.Hardware.Models;
 using RackPeek.Domain.Resources.Hardware.UpsUnits;
@@ -30,8 +31,7 @@ public class GetUpsUnitUseCaseTests
 
         var sut = new GetUpsUnitUseCase(repo);
 
-        var result = await sut.ExecuteAsync("node01");
+        await Assert.ThrowsAsync<NotFoundException>(() => sut.ExecuteAsync("node01"));
 
-        Assert.Null(result);
     }
 }