浏览代码

Abstracted Port UseCases

Tim Jones 1 月之前
父节点
当前提交
6fd11268c9
共有 100 个文件被更改,包括 266 次插入394 次删除
  1. 1 1
      RackPeek.Domain/Helpers/ThrowIfInvalid.cs
  2. 1 1
      RackPeek.Domain/Persistence/IResourceCollection.cs
  3. 9 1
      RackPeek.Domain/Persistence/InMemoryResourceCollection.cs
  4. 9 1
      RackPeek.Domain/Persistence/Yaml/YamlResourceCollection.cs
  5. 0 1
      RackPeek.Domain/Persistence/YamlHardwareRepository.cs
  6. 1 1
      RackPeek.Domain/Resources/Hardware/AccessPoints/AccessPoint.cs
  7. 0 1
      RackPeek.Domain/Resources/Hardware/AccessPoints/AccessPointHardwareReport.cs
  8. 0 1
      RackPeek.Domain/Resources/Hardware/AccessPoints/UpdateAccessPointUseCase.cs
  9. 0 1
      RackPeek.Domain/Resources/Hardware/Desktops/DescribeDesktopUseCase.cs
  10. 4 1
      RackPeek.Domain/Resources/Hardware/Desktops/Desktop.cs
  11. 1 2
      RackPeek.Domain/Resources/Hardware/Desktops/DesktopHardwareReport.cs
  12. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/Gpus/AddDesktopGpuUseCase.cs
  13. 0 1
      RackPeek.Domain/Resources/Hardware/Desktops/Gpus/RemoveDesktopGpuUseCase.cs
  14. 0 1
      RackPeek.Domain/Resources/Hardware/Desktops/Gpus/UpdateDesktopGpuUseCase.cs
  15. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/Nics/AddDesktopNicUseCase.cs
  16. 0 1
      RackPeek.Domain/Resources/Hardware/Desktops/Nics/RemoveDesktopNicUseCase.cs
  17. 0 1
      RackPeek.Domain/Resources/Hardware/Desktops/Nics/UpdateDesktopNicUseCase.cs
  18. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/UpdateDesktopUseCase.cs
  19. 1 1
      RackPeek.Domain/Resources/Hardware/Firewalls/DescribeFirewallUseCase.cs
  20. 5 2
      RackPeek.Domain/Resources/Hardware/Firewalls/Firewall.cs
  21. 0 1
      RackPeek.Domain/Resources/Hardware/Firewalls/FirewallHardwareReport.cs
  22. 0 36
      RackPeek.Domain/Resources/Hardware/Firewalls/Ports/AddFirewallPortUseCase.cs
  23. 0 24
      RackPeek.Domain/Resources/Hardware/Firewalls/Ports/RemoveFirewallPortUseCase.cs
  24. 0 38
      RackPeek.Domain/Resources/Hardware/Firewalls/Ports/UpdateFirewallPortUseCase.cs
  25. 0 1
      RackPeek.Domain/Resources/Hardware/Firewalls/UpdateFirewallUseCase.cs
  26. 4 4
      RackPeek.Domain/Resources/Hardware/GetHardwareSystemTreeUseCase.cs
  27. 5 0
      RackPeek.Domain/Resources/Hardware/Hardware.cs
  28. 0 1
      RackPeek.Domain/Resources/Hardware/Laptops/DescribeLaptopUseCase.cs
  29. 1 1
      RackPeek.Domain/Resources/Hardware/Laptops/Gpus/AddDesktopGpuUseCase.cs
  30. 0 1
      RackPeek.Domain/Resources/Hardware/Laptops/Gpus/RemoveDesktopGpuUseCase.cs
  31. 0 1
      RackPeek.Domain/Resources/Hardware/Laptops/Gpus/UpdateDesktopGpuUseCase.cs
  32. 4 1
      RackPeek.Domain/Resources/Hardware/Laptops/Laptop.cs
  33. 0 1
      RackPeek.Domain/Resources/Hardware/Laptops/LaptopHardwareReportUseCase.cs
  34. 1 1
      RackPeek.Domain/Resources/Hardware/Laptops/UpdateLaptopUseCase.cs
  35. 1 1
      RackPeek.Domain/Resources/Hardware/Routers/DescribeRouterUseCase.cs
  36. 0 36
      RackPeek.Domain/Resources/Hardware/Routers/Ports/AddRouterPortUseCase.cs
  37. 0 24
      RackPeek.Domain/Resources/Hardware/Routers/Ports/RemoveRouterPortUseCase.cs
  38. 0 38
      RackPeek.Domain/Resources/Hardware/Routers/Ports/UpdateRouterPortUseCase.cs
  39. 5 2
      RackPeek.Domain/Resources/Hardware/Routers/Router.cs
  40. 0 1
      RackPeek.Domain/Resources/Hardware/Routers/RouterHardwareReport.cs
  41. 0 1
      RackPeek.Domain/Resources/Hardware/Routers/UpdateRouterUseCase.cs
  42. 0 1
      RackPeek.Domain/Resources/Hardware/Servers/DescribeServerUseCase.cs
  43. 1 1
      RackPeek.Domain/Resources/Hardware/Servers/Gpus/AddGpuUseCase.cs
  44. 0 1
      RackPeek.Domain/Resources/Hardware/Servers/Gpus/RemoveGpuUseCase.cs
  45. 0 1
      RackPeek.Domain/Resources/Hardware/Servers/Gpus/UpdateGpuUseCase.cs
  46. 1 1
      RackPeek.Domain/Resources/Hardware/Servers/Nics/AddNicUseCase.cs
  47. 0 1
      RackPeek.Domain/Resources/Hardware/Servers/Nics/RemoveNicUseCase.cs
  48. 0 1
      RackPeek.Domain/Resources/Hardware/Servers/Nics/UpdateNicUseCase.cs
  49. 8 1
      RackPeek.Domain/Resources/Hardware/Servers/Server.cs
  50. 0 1
      RackPeek.Domain/Resources/Hardware/Servers/ServerHardwareReport.cs
  51. 1 1
      RackPeek.Domain/Resources/Hardware/Servers/UpdateServerUseCase.cs
  52. 1 1
      RackPeek.Domain/Resources/Hardware/Switches/DescribeSwitchUseCase.cs
  53. 0 36
      RackPeek.Domain/Resources/Hardware/Switches/Ports/AddSwitchPortUseCase.cs
  54. 0 24
      RackPeek.Domain/Resources/Hardware/Switches/Ports/RemoveSwitchPortUseCase.cs
  55. 0 38
      RackPeek.Domain/Resources/Hardware/Switches/Ports/UpdateSwitchPortUseCase.cs
  56. 5 2
      RackPeek.Domain/Resources/Hardware/Switches/Switch.cs
  57. 0 1
      RackPeek.Domain/Resources/Hardware/Switches/SwitchHardwareReport.cs
  58. 0 1
      RackPeek.Domain/Resources/Hardware/Switches/UpdateSwitchUseCase.cs
  59. 0 1
      RackPeek.Domain/Resources/Hardware/UpsUnits/DescribeUpsUseCase.cs
  60. 0 1
      RackPeek.Domain/Resources/Hardware/UpsUnits/UpdateUpsUseCase.cs
  61. 1 1
      RackPeek.Domain/Resources/Hardware/UpsUnits/Ups.cs
  62. 0 1
      RackPeek.Domain/Resources/Hardware/UpsUnits/UpsHardwareReport.cs
  63. 0 5
      RackPeek.Domain/Resources/Models/Hardware.cs
  64. 10 3
      RackPeek.Domain/Resources/Resource.cs
  65. 1 1
      RackPeek.Domain/Resources/SubResources/Cpu.cs
  66. 1 1
      RackPeek.Domain/Resources/SubResources/Drive.cs
  67. 1 1
      RackPeek.Domain/Resources/SubResources/Gpu.cs
  68. 1 1
      RackPeek.Domain/Resources/SubResources/Nic.cs
  69. 1 1
      RackPeek.Domain/Resources/SubResources/Port.cs
  70. 1 1
      RackPeek.Domain/Resources/SubResources/Ram.cs
  71. 2 1
      RackPeek.Domain/Resources/SystemResources/SystemResource.cs
  72. 1 1
      RackPeek.Domain/Resources/SystemResources/UseCases/UpdateSystemUseCase.cs
  73. 4 1
      RackPeek.Domain/ServiceCollectionExtensions.cs
  74. 2 1
      RackPeek.Domain/UseCases/Cpus/AddCpuUseCase.cs
  75. 1 1
      RackPeek.Domain/UseCases/Cpus/RemoveCpuUseCase.cs
  76. 1 1
      RackPeek.Domain/UseCases/Cpus/UpdateCpuUseCase.cs
  77. 2 1
      RackPeek.Domain/UseCases/Drives/AddDriveUseCase.cs
  78. 1 1
      RackPeek.Domain/UseCases/Drives/RemoveDriveUseCase.cs
  79. 1 1
      RackPeek.Domain/UseCases/Drives/UpdateDriveUseCase.cs
  80. 53 0
      RackPeek.Domain/UseCases/Ports/AddPortUseCase.cs
  81. 37 0
      RackPeek.Domain/UseCases/Ports/RemovePortUseCase.cs
  82. 55 0
      RackPeek.Domain/UseCases/Ports/UpdatePortUseCase.cs
  83. 0 1
      Shared.Rcl/AccessPoints/AccessPointCardComponent.razor
  84. 0 1
      Shared.Rcl/AccessPoints/AccessPointsListComponent.razor
  85. 1 1
      Shared.Rcl/Commands/AccessPoints/AccessPointAddCommand.cs
  86. 1 1
      Shared.Rcl/Commands/AccessPoints/AccessPointDeleteCommand.cs
  87. 1 1
      Shared.Rcl/Commands/AccessPoints/AccessPointDescribeCommand.cs
  88. 1 1
      Shared.Rcl/Commands/AccessPoints/AccessPointGetByNameCommand.cs
  89. 1 1
      Shared.Rcl/Commands/Desktops/Cpus/DesktopCpuAddCommand.cs
  90. 1 1
      Shared.Rcl/Commands/Desktops/Cpus/DesktopCpuRemoveCommand.cs
  91. 1 1
      Shared.Rcl/Commands/Desktops/Cpus/DesktopCpuSetCommand.cs
  92. 1 1
      Shared.Rcl/Commands/Desktops/DesktopAddCommand.cs
  93. 1 1
      Shared.Rcl/Commands/Desktops/DesktopDeleteCommand.cs
  94. 1 1
      Shared.Rcl/Commands/Desktops/DesktopGetByNameCommand.cs
  95. 1 1
      Shared.Rcl/Commands/Desktops/DesktopGetCommand.cs
  96. 1 1
      Shared.Rcl/Commands/Desktops/Drive/DesktopDriveAddCommand.cs
  97. 1 1
      Shared.Rcl/Commands/Desktops/Drive/DesktopDriveRemoveCommand.cs
  98. 1 1
      Shared.Rcl/Commands/Desktops/Drive/DesktopDriveSetCommand.cs
  99. 1 1
      Shared.Rcl/Commands/Firewalls/FirewallAddCommand.cs
  100. 1 1
      Shared.Rcl/Commands/Firewalls/FirewallDeleteCommand.cs

+ 1 - 1
RackPeek.Domain/Helpers/ThrowIfInvalid.cs

@@ -1,5 +1,5 @@
 using System.ComponentModel.DataAnnotations;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.SubResources;
 using RackPeek.Domain.Resources.SystemResources;
 
 namespace RackPeek.Domain.Helpers;

+ 1 - 1
RackPeek.Domain/Persistence/IResourceCollection.cs

@@ -1,6 +1,6 @@
 using System.Collections;
 using RackPeek.Domain.Resources;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.Services;
 using RackPeek.Domain.Resources.SystemResources;
 

+ 9 - 1
RackPeek.Domain/Persistence/InMemoryResourceCollection.cs

@@ -1,5 +1,13 @@
 using RackPeek.Domain.Resources;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware;
+using RackPeek.Domain.Resources.Hardware.AccessPoints;
+using RackPeek.Domain.Resources.Hardware.Desktops;
+using RackPeek.Domain.Resources.Hardware.Firewalls;
+using RackPeek.Domain.Resources.Hardware.Laptops;
+using RackPeek.Domain.Resources.Hardware.Routers;
+using RackPeek.Domain.Resources.Hardware.Servers;
+using RackPeek.Domain.Resources.Hardware.Switches;
+using RackPeek.Domain.Resources.Hardware.UpsUnits;
 using RackPeek.Domain.Resources.Services;
 using RackPeek.Domain.Resources.SystemResources;
 

+ 9 - 1
RackPeek.Domain/Persistence/Yaml/YamlResourceCollection.cs

@@ -1,6 +1,14 @@
 using System.Collections.Specialized;
 using RackPeek.Domain.Resources;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware;
+using RackPeek.Domain.Resources.Hardware.AccessPoints;
+using RackPeek.Domain.Resources.Hardware.Desktops;
+using RackPeek.Domain.Resources.Hardware.Firewalls;
+using RackPeek.Domain.Resources.Hardware.Laptops;
+using RackPeek.Domain.Resources.Hardware.Routers;
+using RackPeek.Domain.Resources.Hardware.Servers;
+using RackPeek.Domain.Resources.Hardware.Switches;
+using RackPeek.Domain.Resources.Hardware.UpsUnits;
 using RackPeek.Domain.Resources.Services;
 using RackPeek.Domain.Resources.SystemResources;
 using YamlDotNet.Core;

+ 0 - 1
RackPeek.Domain/Persistence/YamlHardwareRepository.cs

@@ -1,5 +1,4 @@
 using RackPeek.Domain.Resources.Hardware;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Persistence;
 

+ 1 - 1
RackPeek.Domain/Resources/Models/AccessPoint.cs → RackPeek.Domain/Resources/Hardware/AccessPoints/AccessPoint.cs

@@ -1,4 +1,4 @@
-namespace RackPeek.Domain.Resources.Models;
+namespace RackPeek.Domain.Resources.Hardware.AccessPoints;
 
 public class AccessPoint : Hardware
 {

+ 0 - 1
RackPeek.Domain/Resources/Hardware/AccessPoints/AccessPointHardwareReport.cs

@@ -1,5 +1,4 @@
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.AccessPoints;
 

+ 0 - 1
RackPeek.Domain/Resources/Hardware/AccessPoints/UpdateAccessPointUseCase.cs

@@ -1,6 +1,5 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.AccessPoints;
 

+ 0 - 1
RackPeek.Domain/Resources/Hardware/Desktops/DescribeDesktopUseCase.cs

@@ -1,6 +1,5 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops;
 

+ 4 - 1
RackPeek.Domain/Resources/Models/Desktop.cs → RackPeek.Domain/Resources/Hardware/Desktops/Desktop.cs

@@ -1,4 +1,7 @@
-namespace RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Servers;
+using RackPeek.Domain.Resources.SubResources;
+
+namespace RackPeek.Domain.Resources.Hardware.Desktops;
 
 public class Desktop : Hardware, ICpuResource, IDriveResource
 {

+ 1 - 2
RackPeek.Domain/Resources/Hardware/Desktops/DesktopHardwareReport.cs

@@ -1,5 +1,4 @@
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops;
 
@@ -24,7 +23,7 @@ public class DesktopHardwareReportUseCase(IResourceCollection repository) : IUse
 {
     public async Task<DesktopHardwareReport> ExecuteAsync()
     {
-        var desktops = await repository.GetAllOfTypeAsync<Models.Desktop>();
+        var desktops = await repository.GetAllOfTypeAsync<Desktop>();
 
         var rows = desktops.Select(desktop =>
         {

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

@@ -1,6 +1,6 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.SubResources;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops.Gpus;
 

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

@@ -1,6 +1,5 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops.Gpus;
 

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

@@ -1,6 +1,5 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops.Gpus;
 

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

@@ -1,6 +1,6 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.SubResources;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops.Nics;
 

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

@@ -1,6 +1,5 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops.Nics;
 

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

@@ -1,6 +1,5 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops.Nics;
 

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Desktops/UpdateDesktopUseCase.cs

@@ -1,6 +1,6 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.SubResources;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops;
 

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

@@ -1,6 +1,6 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.SubResources;
 
 namespace RackPeek.Domain.Resources.Hardware.Firewalls;
 

+ 5 - 2
RackPeek.Domain/Resources/Models/Firewall.cs → RackPeek.Domain/Resources/Hardware/Firewalls/Firewall.cs

@@ -1,6 +1,9 @@
-namespace RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Servers;
+using RackPeek.Domain.Resources.SubResources;
 
-public class Firewall : Hardware
+namespace RackPeek.Domain.Resources.Hardware.Firewalls;
+
+public class Firewall : Hardware, IPortResource
 {
     public const string KindLabel = "Firewall";
     public string? Model { get; set; }

+ 0 - 1
RackPeek.Domain/Resources/Hardware/Firewalls/FirewallHardwareReport.cs

@@ -1,5 +1,4 @@
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Firewalls;
 

+ 0 - 36
RackPeek.Domain/Resources/Hardware/Firewalls/Ports/AddFirewallPortUseCase.cs

@@ -1,36 +0,0 @@
-using RackPeek.Domain.Helpers;
-using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
-
-namespace RackPeek.Domain.Resources.Hardware.Firewalls.Ports;
-
-public class AddFirewallPortUseCase(IResourceCollection repository) : IUseCase
-{
-    public async Task ExecuteAsync(
-        string name,
-        string? type,
-        double? speed,
-        int? ports)
-    {
-        // ToDo pass in properties as inputs, construct the entity in the usecase, ensure optional inputs are nullable
-        // ToDo validate / normalize all inputs
-
-        name = Normalize.HardwareName(name);
-        ThrowIfInvalid.ResourceName(name);
-
-        var nicType = Normalize.NicType(type);
-        ThrowIfInvalid.NicType(nicType);
-
-        var desktop = await repository.GetByNameAsync(name) as Firewall
-                      ?? throw new NotFoundException($"Firewall '{name}' not found.");
-
-        desktop.Ports ??= new List<Port>();
-        desktop.Ports.Add(new Port
-        {
-            Type = nicType,
-            Speed = speed,
-            Count = ports
-        });
-        await repository.UpdateAsync(desktop);
-    }
-}

+ 0 - 24
RackPeek.Domain/Resources/Hardware/Firewalls/Ports/RemoveFirewallPortUseCase.cs

@@ -1,24 +0,0 @@
-using RackPeek.Domain.Helpers;
-using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
-
-namespace RackPeek.Domain.Resources.Hardware.Firewalls.Ports;
-
-public class RemoveFirewallPortUseCase(IResourceCollection repository) : IUseCase
-{
-    public async Task ExecuteAsync(string name, int index)
-    {
-        name = Normalize.HardwareName(name);
-        ThrowIfInvalid.ResourceName(name);
-
-        var firewall = await repository.GetByNameAsync(name) as Firewall
-                       ?? throw new NotFoundException($"Firewall '{name}' not found.");
-
-        if (firewall.Ports == null || index < 0 || index >= firewall.Ports.Count)
-            throw new NotFoundException($"Port index {index} not found on firewall '{name}'.");
-
-        firewall.Ports.RemoveAt(index);
-
-        await repository.UpdateAsync(firewall);
-    }
-}

+ 0 - 38
RackPeek.Domain/Resources/Hardware/Firewalls/Ports/UpdateFirewallPortUseCase.cs

@@ -1,38 +0,0 @@
-using RackPeek.Domain.Helpers;
-using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
-
-namespace RackPeek.Domain.Resources.Hardware.Firewalls.Ports;
-
-public class UpdateFirewallPortUseCase(IResourceCollection repository) : IUseCase
-{
-    public async Task ExecuteAsync(
-        string name,
-        int index,
-        string? type,
-        double? speed,
-        int? ports)
-    {
-        // ToDo pass in properties as inputs, construct the entity in the usecase, ensure optional inputs are nullable
-        // ToDo validate / normalize all inputs
-
-        name = Normalize.HardwareName(name);
-        ThrowIfInvalid.ResourceName(name);
-
-        var nicType = Normalize.NicType(type);
-        ThrowIfInvalid.NicType(nicType);
-
-        var firewall = await repository.GetByNameAsync(name) as Firewall
-                       ?? throw new NotFoundException($"Firewall '{name}' not found.");
-
-        if (firewall.Ports == null || index < 0 || index >= firewall.Ports.Count)
-            throw new NotFoundException($"Port index {index} not found on firewall '{name}'.");
-
-        var nic = firewall.Ports[index];
-        nic.Type = nicType;
-        nic.Speed = speed;
-        nic.Count = ports;
-
-        await repository.UpdateAsync(firewall);
-    }
-}

+ 0 - 1
RackPeek.Domain/Resources/Hardware/Firewalls/UpdateFirewallUseCase.cs

@@ -1,6 +1,5 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Firewalls;
 

+ 4 - 4
RackPeek.Domain/Resources/Hardware/GetHardwareSystemTreeUseCase.cs

@@ -12,14 +12,14 @@ public class GetHardwareSystemTreeUseCase(
     {
         ThrowIfInvalid.ResourceName(hardwareName);
 
-        var server = await repo.GetByNameAsync(hardwareName) as Models.Hardware;
+        var server = await repo.GetByNameAsync(hardwareName) as Hardware;
         if (server is null)
             throw new NotFoundException($"Hardware '{hardwareName}' not found.");
 
         return await BuildDependencyTreeAsync(server);
     }
 
-    private async Task<HardwareDependencyTree> BuildDependencyTreeAsync(Models.Hardware server)
+    private async Task<HardwareDependencyTree> BuildDependencyTreeAsync(Hardware server)
     {
         var systems = await repo.GetDependantsAsync(server.Name);
 
@@ -37,9 +37,9 @@ public class GetHardwareSystemTreeUseCase(
     }
 }
 
-public sealed class HardwareDependencyTree(Models.Hardware hardware, IEnumerable<SystemDependencyTree> systems)
+public sealed class HardwareDependencyTree(Hardware hardware, IEnumerable<SystemDependencyTree> systems)
 {
-    public Models.Hardware Hardware { get; } = hardware;
+    public Hardware Hardware { get; } = hardware;
     public IEnumerable<SystemDependencyTree> Systems { get; } = systems;
 }
 

+ 5 - 0
RackPeek.Domain/Resources/Hardware/Hardware.cs

@@ -0,0 +1,5 @@
+namespace RackPeek.Domain.Resources.Hardware;
+
+public abstract class Hardware : Resource
+{
+}

+ 0 - 1
RackPeek.Domain/Resources/Hardware/Laptops/DescribeLaptopUseCase.cs

@@ -1,6 +1,5 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Laptops;
 

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

@@ -1,6 +1,6 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.SubResources;
 
 namespace RackPeek.Domain.Resources.Hardware.Laptops.Gpus;
 

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

@@ -1,6 +1,5 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Laptops.Gpus;
 

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

@@ -1,6 +1,5 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Laptops.Gpus;
 

+ 4 - 1
RackPeek.Domain/Resources/Models/Laptop.cs → RackPeek.Domain/Resources/Hardware/Laptops/Laptop.cs

@@ -1,4 +1,7 @@
-namespace RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Servers;
+using RackPeek.Domain.Resources.SubResources;
+
+namespace RackPeek.Domain.Resources.Hardware.Laptops;
 
 public class Laptop : Hardware, ICpuResource, IDriveResource
 {

+ 0 - 1
RackPeek.Domain/Resources/Hardware/Laptops/LaptopHardwareReportUseCase.cs

@@ -1,5 +1,4 @@
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Laptops;
 

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Laptops/UpdateLaptopUseCase.cs

@@ -1,6 +1,6 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.SubResources;
 
 namespace RackPeek.Domain.Resources.Hardware.Laptops;
 

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

@@ -1,6 +1,6 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.SubResources;
 
 namespace RackPeek.Domain.Resources.Hardware.Routers;
 

+ 0 - 36
RackPeek.Domain/Resources/Hardware/Routers/Ports/AddRouterPortUseCase.cs

@@ -1,36 +0,0 @@
-using RackPeek.Domain.Helpers;
-using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
-
-namespace RackPeek.Domain.Resources.Hardware.Routers.Ports;
-
-public class AddRouterPortUseCase(IResourceCollection repository) : IUseCase
-{
-    public async Task ExecuteAsync(
-        string name,
-        string? type,
-        double? speed,
-        int? ports)
-    {
-        // ToDo pass in properties as inputs, construct the entity in the usecase, ensure optional inputs are nullable
-        // ToDo validate / normalize all inputs
-
-        name = Normalize.HardwareName(name);
-        ThrowIfInvalid.ResourceName(name);
-
-        var nicType = Normalize.NicType(type);
-        ThrowIfInvalid.NicType(nicType);
-
-        var desktop = await repository.GetByNameAsync(name) as Router
-                      ?? throw new NotFoundException($"Router '{name}' not found.");
-
-        desktop.Ports ??= new List<Port>();
-        desktop.Ports.Add(new Port
-        {
-            Type = nicType,
-            Speed = speed,
-            Count = ports
-        });
-        await repository.UpdateAsync(desktop);
-    }
-}

+ 0 - 24
RackPeek.Domain/Resources/Hardware/Routers/Ports/RemoveRouterPortUseCase.cs

@@ -1,24 +0,0 @@
-using RackPeek.Domain.Helpers;
-using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
-
-namespace RackPeek.Domain.Resources.Hardware.Routers.Ports;
-
-public class RemoveRouterPortUseCase(IResourceCollection repository) : IUseCase
-{
-    public async Task ExecuteAsync(string name, int index)
-    {
-        name = Normalize.HardwareName(name);
-        ThrowIfInvalid.ResourceName(name);
-
-        var Router = await repository.GetByNameAsync(name) as Router
-                     ?? throw new NotFoundException($"Router '{name}' not found.");
-
-        if (Router.Ports == null || index < 0 || index >= Router.Ports.Count)
-            throw new NotFoundException($"Port index {index} not found on Router '{name}'.");
-
-        Router.Ports.RemoveAt(index);
-
-        await repository.UpdateAsync(Router);
-    }
-}

+ 0 - 38
RackPeek.Domain/Resources/Hardware/Routers/Ports/UpdateRouterPortUseCase.cs

@@ -1,38 +0,0 @@
-using RackPeek.Domain.Helpers;
-using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
-
-namespace RackPeek.Domain.Resources.Hardware.Routers.Ports;
-
-public class UpdateRouterPortUseCase(IResourceCollection repository) : IUseCase
-{
-    public async Task ExecuteAsync(
-        string name,
-        int index,
-        string? type,
-        double? speed,
-        int? ports)
-    {
-        // ToDo pass in properties as inputs, construct the entity in the usecase, ensure optional inputs are nullable
-        // ToDo validate / normalize all inputs
-
-        name = Normalize.HardwareName(name);
-        ThrowIfInvalid.ResourceName(name);
-
-        var nicType = Normalize.NicType(type);
-        ThrowIfInvalid.NicType(nicType);
-
-        var Router = await repository.GetByNameAsync(name) as Router
-                     ?? throw new NotFoundException($"Router '{name}' not found.");
-
-        if (Router.Ports == null || index < 0 || index >= Router.Ports.Count)
-            throw new NotFoundException($"Port index {index} not found on Router '{name}'.");
-
-        var nic = Router.Ports[index];
-        nic.Type = nicType;
-        nic.Speed = speed;
-        nic.Count = ports;
-
-        await repository.UpdateAsync(Router);
-    }
-}

+ 5 - 2
RackPeek.Domain/Resources/Models/Router.cs → RackPeek.Domain/Resources/Hardware/Routers/Router.cs

@@ -1,6 +1,9 @@
-namespace RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Servers;
+using RackPeek.Domain.Resources.SubResources;
 
-public class Router : Hardware
+namespace RackPeek.Domain.Resources.Hardware.Routers;
+
+public class Router : Hardware, IPortResource
 {
     public const string KindLabel = "Router";
     public string? Model { get; set; }

+ 0 - 1
RackPeek.Domain/Resources/Hardware/Routers/RouterHardwareReport.cs

@@ -1,5 +1,4 @@
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Routers;
 

+ 0 - 1
RackPeek.Domain/Resources/Hardware/Routers/UpdateRouterUseCase.cs

@@ -1,6 +1,5 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Routers;
 

+ 0 - 1
RackPeek.Domain/Resources/Hardware/Servers/DescribeServerUseCase.cs

@@ -1,6 +1,5 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers;
 

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Servers/Gpus/AddGpuUseCase.cs

@@ -1,6 +1,6 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.SubResources;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers.Gpus;
 

+ 0 - 1
RackPeek.Domain/Resources/Hardware/Servers/Gpus/RemoveGpuUseCase.cs

@@ -1,6 +1,5 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers.Gpus;
 

+ 0 - 1
RackPeek.Domain/Resources/Hardware/Servers/Gpus/UpdateGpuUseCase.cs

@@ -1,6 +1,5 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers.Gpus;
 

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Servers/Nics/AddNicUseCase.cs

@@ -1,6 +1,6 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.SubResources;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers.Nics;
 

+ 0 - 1
RackPeek.Domain/Resources/Hardware/Servers/Nics/RemoveNicUseCase.cs

@@ -1,7 +1,6 @@
 using System.ComponentModel.DataAnnotations;
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers.Nics;
 

+ 0 - 1
RackPeek.Domain/Resources/Hardware/Servers/Nics/UpdateNicUseCase.cs

@@ -1,7 +1,6 @@
 using System.ComponentModel.DataAnnotations;
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers.Nics;
 

+ 8 - 1
RackPeek.Domain/Resources/Models/Server.cs → RackPeek.Domain/Resources/Hardware/Servers/Server.cs

@@ -1,4 +1,6 @@
-namespace RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.SubResources;
+
+namespace RackPeek.Domain.Resources.Hardware.Servers;
 
 public class Server : Hardware, ICpuResource, IDriveResource
 {
@@ -19,4 +21,9 @@ public interface ICpuResource
 public interface IDriveResource
 {
     public List<Drive>? Drives { get; set; }
+}
+
+public interface IPortResource
+{
+    public List<Port>? Ports { get; set; }
 }

+ 0 - 1
RackPeek.Domain/Resources/Hardware/Servers/ServerHardwareReport.cs

@@ -1,5 +1,4 @@
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers;
 

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Servers/UpdateServerUseCase.cs

@@ -1,6 +1,6 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.SubResources;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers;
 

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

@@ -1,6 +1,6 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.SubResources;
 
 namespace RackPeek.Domain.Resources.Hardware.Switches;
 

+ 0 - 36
RackPeek.Domain/Resources/Hardware/Switches/Ports/AddSwitchPortUseCase.cs

@@ -1,36 +0,0 @@
-using RackPeek.Domain.Helpers;
-using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
-
-namespace RackPeek.Domain.Resources.Hardware.Switches.Ports;
-
-public class AddSwitchPortUseCase(IResourceCollection repository) : IUseCase
-{
-    public async Task ExecuteAsync(
-        string name,
-        string? type,
-        double? speed,
-        int? ports)
-    {
-        // ToDo pass in properties as inputs, construct the entity in the usecase, ensure optional inputs are nullable
-        // ToDo validate / normalize all inputs
-
-        name = Normalize.HardwareName(name);
-        ThrowIfInvalid.ResourceName(name);
-
-        var nicType = Normalize.NicType(type);
-        ThrowIfInvalid.NicType(nicType);
-
-        var desktop = await repository.GetByNameAsync(name) as Switch
-                      ?? throw new NotFoundException($"Switch '{name}' not found.");
-
-        desktop.Ports ??= new List<Port>();
-        desktop.Ports.Add(new Port
-        {
-            Type = nicType,
-            Speed = speed,
-            Count = ports
-        });
-        await repository.UpdateAsync(desktop);
-    }
-}

+ 0 - 24
RackPeek.Domain/Resources/Hardware/Switches/Ports/RemoveSwitchPortUseCase.cs

@@ -1,24 +0,0 @@
-using RackPeek.Domain.Helpers;
-using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
-
-namespace RackPeek.Domain.Resources.Hardware.Switches.Ports;
-
-public class RemoveSwitchPortUseCase(IResourceCollection repository) : IUseCase
-{
-    public async Task ExecuteAsync(string name, int index)
-    {
-        name = Normalize.HardwareName(name);
-        ThrowIfInvalid.ResourceName(name);
-
-        var Switch = await repository.GetByNameAsync(name) as Switch
-                     ?? throw new NotFoundException($"Switch '{name}' not found.");
-
-        if (Switch.Ports == null || index < 0 || index >= Switch.Ports.Count)
-            throw new NotFoundException($"Port index {index} not found on Switch '{name}'.");
-
-        Switch.Ports.RemoveAt(index);
-
-        await repository.UpdateAsync(Switch);
-    }
-}

+ 0 - 38
RackPeek.Domain/Resources/Hardware/Switches/Ports/UpdateSwitchPortUseCase.cs

@@ -1,38 +0,0 @@
-using RackPeek.Domain.Helpers;
-using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
-
-namespace RackPeek.Domain.Resources.Hardware.Switches.Ports;
-
-public class UpdateSwitchPortUseCase(IResourceCollection repository) : IUseCase
-{
-    public async Task ExecuteAsync(
-        string name,
-        int index,
-        string? type,
-        double? speed,
-        int? ports)
-    {
-        // ToDo pass in properties as inputs, construct the entity in the usecase, ensure optional inputs are nullable
-        // ToDo validate / normalize all inputs
-
-        name = Normalize.HardwareName(name);
-        ThrowIfInvalid.ResourceName(name);
-
-        var nicType = Normalize.NicType(type);
-        ThrowIfInvalid.NicType(nicType);
-
-        var Switch = await repository.GetByNameAsync(name) as Switch
-                     ?? throw new NotFoundException($"Switch '{name}' not found.");
-
-        if (Switch.Ports == null || index < 0 || index >= Switch.Ports.Count)
-            throw new NotFoundException($"Port index {index} not found on Switch '{name}'.");
-
-        var nic = Switch.Ports[index];
-        nic.Type = nicType;
-        nic.Speed = speed;
-        nic.Count = ports;
-
-        await repository.UpdateAsync(Switch);
-    }
-}

+ 5 - 2
RackPeek.Domain/Resources/Models/Switch.cs → RackPeek.Domain/Resources/Hardware/Switches/Switch.cs

@@ -1,6 +1,9 @@
-namespace RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Servers;
+using RackPeek.Domain.Resources.SubResources;
 
-public class Switch : Hardware
+namespace RackPeek.Domain.Resources.Hardware.Switches;
+
+public class Switch : Hardware, IPortResource
 {
     public const string KindLabel = "Switch";
     public string? Model { get; set; }

+ 0 - 1
RackPeek.Domain/Resources/Hardware/Switches/SwitchHardwareReport.cs

@@ -1,5 +1,4 @@
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Switches;
 

+ 0 - 1
RackPeek.Domain/Resources/Hardware/Switches/UpdateSwitchUseCase.cs

@@ -1,6 +1,5 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Switches;
 

+ 0 - 1
RackPeek.Domain/Resources/Hardware/UpsUnits/DescribeUpsUseCase.cs

@@ -1,6 +1,5 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.UpsUnits;
 

+ 0 - 1
RackPeek.Domain/Resources/Hardware/UpsUnits/UpdateUpsUseCase.cs

@@ -1,6 +1,5 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.UpsUnits;
 

+ 1 - 1
RackPeek.Domain/Resources/Models/Ups.cs → RackPeek.Domain/Resources/Hardware/UpsUnits/Ups.cs

@@ -1,4 +1,4 @@
-namespace RackPeek.Domain.Resources.Models;
+namespace RackPeek.Domain.Resources.Hardware.UpsUnits;
 
 public class Ups : Hardware
 {

+ 0 - 1
RackPeek.Domain/Resources/Hardware/UpsUnits/UpsHardwareReport.cs

@@ -1,5 +1,4 @@
 using RackPeek.Domain.Persistence;
-using RackPeek.Domain.Resources.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.UpsUnits;
 

+ 0 - 5
RackPeek.Domain/Resources/Models/Hardware.cs

@@ -1,5 +0,0 @@
-namespace RackPeek.Domain.Resources.Models;
-
-public abstract class Hardware : Resource
-{
-}

+ 10 - 3
RackPeek.Domain/Resources/Resource.cs

@@ -1,4 +1,11 @@
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.AccessPoints;
+using RackPeek.Domain.Resources.Hardware.Desktops;
+using RackPeek.Domain.Resources.Hardware.Firewalls;
+using RackPeek.Domain.Resources.Hardware.Laptops;
+using RackPeek.Domain.Resources.Hardware.Routers;
+using RackPeek.Domain.Resources.Hardware.Servers;
+using RackPeek.Domain.Resources.Hardware.Switches;
+using RackPeek.Domain.Resources.Hardware.UpsUnits;
 using RackPeek.Domain.Resources.Services;
 using RackPeek.Domain.Resources.SystemResources;
 
@@ -37,7 +44,7 @@ public abstract class Resource
     
     private static readonly Dictionary<Type, string> TypeToKindMap = new()
     {
-        { typeof(Models.Hardware), "Hardware" },
+        { typeof(Hardware.Hardware), "Hardware" },
         { typeof(Server), "Server" },
         { typeof(Switch), "Switch" },
         { typeof(Firewall), "Firewall" },
@@ -69,7 +76,7 @@ public abstract class Resource
             return true;
 
         // System -> Hardware
-        if (childKind == "system" && parent is Models.Hardware)
+        if (childKind == "system" && parent is Hardware.Hardware)
             return true;
 
         return false;

+ 1 - 1
RackPeek.Domain/Resources/Models/Cpu.cs → RackPeek.Domain/Resources/SubResources/Cpu.cs

@@ -1,4 +1,4 @@
-namespace RackPeek.Domain.Resources.Models;
+namespace RackPeek.Domain.Resources.SubResources;
 
 public class Cpu
 {

+ 1 - 1
RackPeek.Domain/Resources/Models/Drive.cs → RackPeek.Domain/Resources/SubResources/Drive.cs

@@ -1,4 +1,4 @@
-namespace RackPeek.Domain.Resources.Models;
+namespace RackPeek.Domain.Resources.SubResources;
 
 public class Drive
 {

+ 1 - 1
RackPeek.Domain/Resources/Models/Gpu.cs → RackPeek.Domain/Resources/SubResources/Gpu.cs

@@ -1,4 +1,4 @@
-namespace RackPeek.Domain.Resources.Models;
+namespace RackPeek.Domain.Resources.SubResources;
 
 public class Gpu
 {

+ 1 - 1
RackPeek.Domain/Resources/Models/Nic.cs → RackPeek.Domain/Resources/SubResources/Nic.cs

@@ -1,4 +1,4 @@
-namespace RackPeek.Domain.Resources.Models;
+namespace RackPeek.Domain.Resources.SubResources;
 
 public class Nic
 {

+ 1 - 1
RackPeek.Domain/Resources/Models/Port.cs → RackPeek.Domain/Resources/SubResources/Port.cs

@@ -1,4 +1,4 @@
-namespace RackPeek.Domain.Resources.Models;
+namespace RackPeek.Domain.Resources.SubResources;
 
 public class Port
 {

+ 1 - 1
RackPeek.Domain/Resources/Models/Ram.cs → RackPeek.Domain/Resources/SubResources/Ram.cs

@@ -1,4 +1,4 @@
-namespace RackPeek.Domain.Resources.Models;
+namespace RackPeek.Domain.Resources.SubResources;
 
 public class Ram
 {

+ 2 - 1
RackPeek.Domain/Resources/SystemResources/SystemResource.cs

@@ -1,4 +1,5 @@
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Servers;
+using RackPeek.Domain.Resources.SubResources;
 
 namespace RackPeek.Domain.Resources.SystemResources;
 

+ 1 - 1
RackPeek.Domain/Resources/SystemResources/UseCases/UpdateSystemUseCase.cs

@@ -51,7 +51,7 @@ public class UpdateSystemUseCase(IResourceCollection repository) : IUseCase
         if (!string.IsNullOrWhiteSpace(runsOn))
         {
             ThrowIfInvalid.ResourceName(runsOn);
-            var parentHardware = await repository.GetByNameAsync(runsOn) as Models.Hardware;
+            var parentHardware = await repository.GetByNameAsync(runsOn) as Hardware.Hardware;
             if (parentHardware == null) throw new NotFoundException($"Parent hardware '{runsOn}' not found.");
             system.RunsOn = runsOn;
         }

+ 4 - 1
RackPeek.Domain/ServiceCollectionExtensions.cs

@@ -4,12 +4,12 @@ using RackPeek.Domain.Persistence;
 using RackPeek.Domain.Resources;
 using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.Hardware.Desktops;
-using RackPeek.Domain.Resources.Models;
 using RackPeek.Domain.Resources.Services;
 using RackPeek.Domain.Resources.SystemResources;
 using RackPeek.Domain.UseCases;
 using RackPeek.Domain.UseCases.Cpus;
 using RackPeek.Domain.UseCases.Drives;
+using RackPeek.Domain.UseCases.Ports;
 using RackPeek.Domain.UseCases.Tags;
 
 namespace RackPeek.Domain;
@@ -68,6 +68,9 @@ public static class ServiceCollectionExtensions
         services.AddScoped(typeof(IRemoveDriveUseCase<>), typeof(RemoveDriveUseCase<>));
         services.AddScoped(typeof(IUpdateDriveUseCase<>), typeof(UpdateDriveUseCase<>));
 
+        services.AddScoped(typeof(IAddPortUseCase<>), typeof(AddPortUseCase<>));
+        services.AddScoped(typeof(IRemovePortUseCase<>), typeof(RemovePortUseCase<>));
+        services.AddScoped(typeof(IUpdatePortUseCase<>), typeof(UpdatePortUseCase<>));
         
         var usecases = Assembly.GetAssembly(typeof(IUseCase))
             ?.GetTypes()

+ 2 - 1
RackPeek.Domain/UseCases/Cpus/AddCpuUseCase.cs

@@ -1,7 +1,8 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
 using RackPeek.Domain.Resources;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Servers;
+using RackPeek.Domain.Resources.SubResources;
 
 namespace RackPeek.Domain.UseCases.Cpus;
 

+ 1 - 1
RackPeek.Domain/UseCases/Cpus/RemoveCpuUseCase.cs

@@ -1,7 +1,7 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
 using RackPeek.Domain.Resources;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Servers;
 
 namespace RackPeek.Domain.UseCases.Cpus;
 

+ 1 - 1
RackPeek.Domain/UseCases/Cpus/UpdateCpuUseCase.cs

@@ -1,7 +1,7 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
 using RackPeek.Domain.Resources;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Servers;
 
 namespace RackPeek.Domain.UseCases.Cpus;
 

+ 2 - 1
RackPeek.Domain/UseCases/Drives/AddDriveUseCase.cs

@@ -1,7 +1,8 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
 using RackPeek.Domain.Resources;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Servers;
+using RackPeek.Domain.Resources.SubResources;
 
 namespace RackPeek.Domain.UseCases.Drives;
 

+ 1 - 1
RackPeek.Domain/UseCases/Drives/RemoveDriveUseCase.cs

@@ -1,7 +1,7 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
 using RackPeek.Domain.Resources;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Servers;
 
 namespace RackPeek.Domain.UseCases.Drives;
 

+ 1 - 1
RackPeek.Domain/UseCases/Drives/UpdateDriveUseCase.cs

@@ -1,7 +1,7 @@
 using RackPeek.Domain.Helpers;
 using RackPeek.Domain.Persistence;
 using RackPeek.Domain.Resources;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Servers;
 
 namespace RackPeek.Domain.UseCases.Drives;
 

+ 53 - 0
RackPeek.Domain/UseCases/Ports/AddPortUseCase.cs

@@ -0,0 +1,53 @@
+using RackPeek.Domain.Helpers;
+using RackPeek.Domain.Persistence;
+using RackPeek.Domain.Resources;
+using RackPeek.Domain.Resources.Hardware.Firewalls;
+using RackPeek.Domain.Resources.Hardware.Servers;
+using RackPeek.Domain.Resources.SubResources;
+
+namespace RackPeek.Domain.UseCases.Ports;
+public interface IAddPortUseCase<T> : IResourceUseCase<T>
+    where T : Resource
+{
+    public Task ExecuteAsync(
+        string name,
+        string? type,
+        double? speed,
+        int? ports);
+}
+
+public class AddPortUseCase<T>(IResourceCollection repository) : IAddPortUseCase<T> where T : Resource
+{
+    public async Task ExecuteAsync(
+        string name,
+        string? type,
+        double? speed,
+        int? ports)
+    {
+        // ToDo pass in properties as inputs, construct the entity in the usecase, ensure optional inputs are nullable
+        // ToDo validate / normalize all inputs
+
+        name = Normalize.HardwareName(name);
+        ThrowIfInvalid.ResourceName(name);
+
+        var nicType = Normalize.NicType(type);
+        ThrowIfInvalid.NicType(nicType);
+
+        var resource = await repository.GetByNameAsync<T>(name)
+                      ?? throw new NotFoundException($"Resource '{name}' not found.");
+
+        if (resource is not IPortResource pr)
+        {
+            throw new NotFoundException($"Resource '{name}' not found.");
+        }
+        
+        pr.Ports ??= new List<Port>();
+        pr.Ports.Add(new Port
+        {
+            Type = nicType,
+            Speed = speed,
+            Count = ports
+        });
+        await repository.UpdateAsync(resource);
+    }
+}

+ 37 - 0
RackPeek.Domain/UseCases/Ports/RemovePortUseCase.cs

@@ -0,0 +1,37 @@
+using RackPeek.Domain.Helpers;
+using RackPeek.Domain.Persistence;
+using RackPeek.Domain.Resources;
+using RackPeek.Domain.Resources.Hardware.Firewalls;
+using RackPeek.Domain.Resources.Hardware.Servers;
+
+namespace RackPeek.Domain.UseCases.Ports;
+public interface IRemovePortUseCase<T> : IResourceUseCase<T>
+    where T : Resource
+{
+    public Task ExecuteAsync(string name, int index);
+}
+
+public class RemovePortUseCase<T>(IResourceCollection repository) : IRemovePortUseCase<T> where T : Resource
+{
+    public async Task ExecuteAsync(string name, int index)
+    {
+        name = Normalize.HardwareName(name);
+        ThrowIfInvalid.ResourceName(name);
+
+        var resource = await repository.GetByNameAsync<T>(name)
+                       ?? throw new NotFoundException($"Resource '{name}' not found.");
+
+        if (resource is not IPortResource pr)
+        {
+            throw new NotFoundException($"Resource '{name}' not found.");
+        }
+        
+
+        if (pr.Ports == null || index < 0 || index >= pr.Ports.Count)
+            throw new NotFoundException($"Port index {index} not found on '{name}'.");
+
+        pr.Ports.RemoveAt(index);
+
+        await repository.UpdateAsync(resource);
+    }
+}

+ 55 - 0
RackPeek.Domain/UseCases/Ports/UpdatePortUseCase.cs

@@ -0,0 +1,55 @@
+using RackPeek.Domain.Helpers;
+using RackPeek.Domain.Persistence;
+using RackPeek.Domain.Resources;
+using RackPeek.Domain.Resources.Hardware.Firewalls;
+using RackPeek.Domain.Resources.Hardware.Servers;
+
+namespace RackPeek.Domain.UseCases.Ports;
+public interface IUpdatePortUseCase<T> : IResourceUseCase<T>
+    where T : Resource
+{
+    public Task ExecuteAsync(
+        string name,
+        int index,
+        string? type,
+        double? speed,
+        int? ports);
+}
+
+public class UpdatePortUseCase<T>(IResourceCollection repository) : IUpdatePortUseCase<T> where T : Resource
+{
+    public async Task ExecuteAsync(
+        string name,
+        int index,
+        string? type,
+        double? speed,
+        int? ports)
+    {
+        // ToDo pass in properties as inputs, construct the entity in the usecase, ensure optional inputs are nullable
+        // ToDo validate / normalize all inputs
+
+        name = Normalize.HardwareName(name);
+        ThrowIfInvalid.ResourceName(name);
+
+        var nicType = Normalize.NicType(type);
+        ThrowIfInvalid.NicType(nicType);
+
+        var resource = await repository.GetByNameAsync<T>(name)
+                       ?? throw new NotFoundException($"Resource '{name}' not found.");
+
+        if (resource is not IPortResource pr)
+        {
+            throw new NotFoundException($"Resource '{name}' not found.");
+        }
+
+        if (pr.Ports == null || index < 0 || index >= pr.Ports.Count)
+            throw new NotFoundException($"Port index {index} not found on '{name}'.");
+
+        var nic = pr.Ports[index];
+        nic.Type = nicType;
+        nic.Speed = speed;
+        nic.Count = ports;
+
+        await repository.UpdateAsync(resource);
+    }
+}

+ 0 - 1
Shared.Rcl/AccessPoints/AccessPointCardComponent.razor

@@ -1,6 +1,5 @@
 @using RackPeek.Domain.Resources.Hardware.AccessPoints
 @using RackPeek.Domain.Resources.Hardware.Desktops
-@using RackPeek.Domain.Resources.Models
 @using RackPeek.Domain.UseCases
 
 @inject UpdateAccessPointUseCase UpdateUseCase

+ 0 - 1
Shared.Rcl/AccessPoints/AccessPointsListComponent.razor

@@ -1,5 +1,4 @@
 @using RackPeek.Domain.Resources.Hardware.AccessPoints
-@using RackPeek.Domain.Resources.Models
 @inject IGetAllResourcesByKindUseCase<AccessPoint> GetAllUseCase
 @inject NavigationManager Nav
 

+ 1 - 1
Shared.Rcl/Commands/AccessPoints/AccessPointAddCommand.cs

@@ -1,6 +1,6 @@
 using System.ComponentModel;
 using Microsoft.Extensions.DependencyInjection;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.AccessPoints;
 using RackPeek.Domain.UseCases;
 using Spectre.Console;
 using Spectre.Console.Cli;

+ 1 - 1
Shared.Rcl/Commands/AccessPoints/AccessPointDeleteCommand.cs

@@ -1,5 +1,5 @@
 using Microsoft.Extensions.DependencyInjection;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.AccessPoints;
 using RackPeek.Domain.UseCases;
 using Spectre.Console;
 using Spectre.Console.Cli;

+ 1 - 1
Shared.Rcl/Commands/AccessPoints/AccessPointDescribeCommand.cs

@@ -1,5 +1,5 @@
 using Microsoft.Extensions.DependencyInjection;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.AccessPoints;
 using RackPeek.Domain.UseCases;
 using Spectre.Console;
 using Spectre.Console.Cli;

+ 1 - 1
Shared.Rcl/Commands/AccessPoints/AccessPointGetByNameCommand.cs

@@ -1,5 +1,5 @@
 using Microsoft.Extensions.DependencyInjection;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.AccessPoints;
 using RackPeek.Domain.UseCases;
 using Spectre.Console;
 using Spectre.Console.Cli;

+ 1 - 1
Shared.Rcl/Commands/Desktops/Cpus/DesktopCpuAddCommand.cs

@@ -1,5 +1,5 @@
 using Microsoft.Extensions.DependencyInjection;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Desktops;
 using RackPeek.Domain.UseCases.Cpus;
 using Spectre.Console;
 using Spectre.Console.Cli;

+ 1 - 1
Shared.Rcl/Commands/Desktops/Cpus/DesktopCpuRemoveCommand.cs

@@ -1,5 +1,5 @@
 using Microsoft.Extensions.DependencyInjection;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Desktops;
 using RackPeek.Domain.UseCases.Cpus;
 using Spectre.Console;
 using Spectre.Console.Cli;

+ 1 - 1
Shared.Rcl/Commands/Desktops/Cpus/DesktopCpuSetCommand.cs

@@ -1,5 +1,5 @@
 using Microsoft.Extensions.DependencyInjection;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Desktops;
 using RackPeek.Domain.UseCases.Cpus;
 using Spectre.Console;
 using Spectre.Console.Cli;

+ 1 - 1
Shared.Rcl/Commands/Desktops/DesktopAddCommand.cs

@@ -1,5 +1,5 @@
 using Microsoft.Extensions.DependencyInjection;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Desktops;
 using RackPeek.Domain.UseCases;
 using Spectre.Console;
 using Spectre.Console.Cli;

+ 1 - 1
Shared.Rcl/Commands/Desktops/DesktopDeleteCommand.cs

@@ -1,5 +1,5 @@
 using Microsoft.Extensions.DependencyInjection;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Desktops;
 using RackPeek.Domain.UseCases;
 using Spectre.Console;
 using Spectre.Console.Cli;

+ 1 - 1
Shared.Rcl/Commands/Desktops/DesktopGetByNameCommand.cs

@@ -1,5 +1,5 @@
 using Microsoft.Extensions.DependencyInjection;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Desktops;
 using RackPeek.Domain.UseCases;
 using Spectre.Console;
 using Spectre.Console.Cli;

+ 1 - 1
Shared.Rcl/Commands/Desktops/DesktopGetCommand.cs

@@ -1,5 +1,5 @@
 using Microsoft.Extensions.DependencyInjection;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Desktops;
 using RackPeek.Domain.UseCases;
 using Spectre.Console;
 using Spectre.Console.Cli;

+ 1 - 1
Shared.Rcl/Commands/Desktops/Drive/DesktopDriveAddCommand.cs

@@ -1,5 +1,5 @@
 using Microsoft.Extensions.DependencyInjection;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Desktops;
 using RackPeek.Domain.UseCases.Drives;
 using Spectre.Console;
 using Spectre.Console.Cli;

+ 1 - 1
Shared.Rcl/Commands/Desktops/Drive/DesktopDriveRemoveCommand.cs

@@ -1,5 +1,5 @@
 using Microsoft.Extensions.DependencyInjection;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Desktops;
 using RackPeek.Domain.UseCases.Drives;
 using Spectre.Console;
 using Spectre.Console.Cli;

+ 1 - 1
Shared.Rcl/Commands/Desktops/Drive/DesktopDriveSetCommand.cs

@@ -1,5 +1,5 @@
 using Microsoft.Extensions.DependencyInjection;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Desktops;
 using RackPeek.Domain.UseCases.Drives;
 using Spectre.Console;
 using Spectre.Console.Cli;

+ 1 - 1
Shared.Rcl/Commands/Firewalls/FirewallAddCommand.cs

@@ -1,5 +1,5 @@
 using Microsoft.Extensions.DependencyInjection;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Firewalls;
 using RackPeek.Domain.UseCases;
 using Spectre.Console;
 using Spectre.Console.Cli;

+ 1 - 1
Shared.Rcl/Commands/Firewalls/FirewallDeleteCommand.cs

@@ -1,5 +1,5 @@
 using Microsoft.Extensions.DependencyInjection;
-using RackPeek.Domain.Resources.Models;
+using RackPeek.Domain.Resources.Hardware.Firewalls;
 using RackPeek.Domain.UseCases;
 using Spectre.Console;
 using Spectre.Console.Cli;

部分文件因为文件数量过多而无法显示